将 Google 表单上的空字段替换为字符串

2023-12-04

这段代码效果很好! 提交表单后,它会自动填充我创建的模板,然后将其发送到我的电子邮件。 除非用户在表单上留下空白字段,否则这非常有效。 如果是这样的话,自动填充的顺序是错误的...... 如果用户决定将字段留空,是否可以自动包含文本(例如“未指定”)? 如果用户输入文本,那就太好了!如果没有,那么我希望它显示“未指定”。

请帮忙!

 // Requisition Form
// Get template from Google Docs and name it
var docTemplate = "the tamplate I created";
var docName = "Requisition Form";

    // When Form Gets submitted
    function onFormSubmit(e) {
      //Get information from form and set as variables
      var email_address = "myemail";
      var business_entity = e.values[2];
      var rotation = e.values[3];
      var category = e.values[4];
      var city = e.values[5];
      var state = e.values[6];
      var environment = e.values[7];
      var date = e.values[8];
      var recurring = e.values[9];
      var supervisor = e.values[10];
      var phone = e.values[11];
      var email = e.values[12];
      var background = e.values[13];
      if (e.values[13]=null) {
          e.values[13]='not specified';}  //this does not work!
      var skills = e.values[14];
        if (e.values[14]=null) {
          e.values[14]='not specified';}  //this does not work!
      var development = e.values[15];
      var knowledge = e.values[16];
      var responsibilities = e.values[17];

      // Get document template, copy it as a new temp doc, and save the Doc’s id
      var copyId = DocsList.getFileById(docTemplate)
      .makeCopy(docName+' for '+supervisor)
      .getId();

      // Open the temporary document
      var copyDoc = DocumentApp.openById(copyId);

      // Get the document’s body section
      var copyBody = copyDoc.getActiveSection();

      // Replace place holder keys, in our google doc template
      copyBody.replaceText('keyBU', business_entity);
      copyBody.replaceText('keyRotation', rotation);
      copyBody.replaceText('keyCategory', category);
      copyBody.replaceText('keyCity', city);
      copyBody.replaceText('keyState', state);
      copyBody.replaceText('keyEnvironment', environment);
      copyBody.replaceText('keyDate', date);
      copyBody.replaceText('keyRecurring', recurring);
      copyBody.replaceText('keySupervisor', supervisor);
      copyBody.replaceText('keyPhone', phone);
      copyBody.replaceText('keyEmail', email);
      copyBody.replaceText('keyBackground', background);
      copyBody.replaceText('keySkills', skills);
      copyBody.replaceText('keyDevelopment', development);
      copyBody.replaceText('keyKnowledge', knowledge);
      copyBody.replaceText('keyResponsibilities', responsibilities);

      // Save and close the temporary document
      copyDoc.saveAndClose();

      // Convert temporary document to PDF
      var pdf = DocsList.getFileById(copyId).getAs("application/pdf");

      // Attach PDF and send the email
      var subject = "Requisition Form";
      var body = "Here is a Requisition Form from " + supervisor + "";
      MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});

      // Delete temp file
      DocsList.getFileById(copyId).setTrashed(true);
    }

使用命名值而不是索引获取响应...即使某些字段留空,也不会出现任何可能的混乱。

See 文档在这里.

您可以使用以下命令检索项目名称FormApp 方法 getTitle()或者直接在脚本中输入名称,因为您似乎确切地知道问题标题。

例子 :

e.namedValues   {'First Name': ['Jane'], 'Timestamp': ['6/7/2015 20:54:13'], 'Last Name': ['Doe']}  An object containing the question names and values from the form submission

EDIT 2 :

(第一次编辑非常相似,但我注意到空字段检测写得不好。 我在下面的代码中使用了紧凑的 IF 形式以使代码更简单。)

下面是一个完整的例子,使用namedValues代替indexed values.

顺便说一句,我添加了一个测试函数,用于模拟具有 2 个空字段的表单提交。(最初的想法借自这篇文章(Mogsdad):如何测试 GAS 中的触发功能?)

function onFormSubmit(e) {
  //Get information from form and set as variables
  var email_address = "myemail";
  var business_entity = e.namedValues['Please select your business entity'];
  var rotation = e.namedValues['Rotation Name'];
  var category = e.namedValues["Rotation Category"];
  var city = e.namedValues["City"];
  var state = e.namedValues["State"];
  var environment = e.namedValues["Work Environment"];
  var date = e.namedValues["Date Available"];
  var recurring = e.namedValues["Is this a recurring ALLEX rotation or a one time only request?"];
  var supervisor = e.namedValues["Supervisor name"];
  var phone = e.namedValues["Supervisor phone number"];
  var email = e.namedValues["Supervisor email"];
  var background = e.namedValues["Preferred background"]!=''? e.namedValues["Preferred  background"] : 'not specified'; 
  // compact IF form : if not empty then value else 'not specified'
  var skills = e.namedValues["Specific skills required"] !=''? e.namedValues["Specific skills required"] : 'not specified';
  var development = e.namedValues["Skills to be developed in this rotation"];
  var knowledge = e.namedValues["Knowledge to be gained in the rotation"];
  var responsibilities = e.namedValues["Project and/or ALLEX Responsibilities"];
  var docName = 'test doc';
  // Get document template, copy it as a new temp doc, and save the Doc’s id
  var copyId = DocsList.getFileById("18-j5MOX3MkVsydXzFTjH5DZaEVF-5ZhYZQuDcLkEDCI")
  .makeCopy(docName+' for '+supervisor)
  .getId();
  // Open the temporary document
  var copyDoc = DocumentApp.openById(copyId);
  // Get the document’s body section
  var copyBody = copyDoc.getActiveSection();
  // Replace place holder keys, in our google doc template
  copyBody.replaceText('keyBU', business_entity);
  copyBody.replaceText('keyRotation', rotation);
  copyBody.replaceText('keyCategory', category);
  copyBody.replaceText('keyCity', city);
  copyBody.replaceText('keyState', state);
  copyBody.replaceText('keyEnvironment', environment);
  copyBody.replaceText('keyDate', date);
  copyBody.replaceText('keyRecurring', recurring);
  copyBody.replaceText('keySupervisor', supervisor);
  copyBody.replaceText('keyPhone', phone);
  copyBody.replaceText('keyEmail', email);
  copyBody.replaceText('keyBackground', background);
  copyBody.replaceText('keySkills', skills);
  copyBody.replaceText('keyDevelopment', development);
  copyBody.replaceText('keyKnowledge', knowledge);
  copyBody.replaceText('keyResponsibilities', responsibilities);
  // Save and close the temporary document
  copyDoc.saveAndClose();
  // Convert temporary document to PDF
  var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
  // Attach PDF and send the email
  var subject = "Requisition Form";
  var body = "Here is a Requisition Form from " + supervisor + "";
  MailApp.sendEmail(Session.getEffectiveUser().getEmail(), subject, body, {htmlBody: body, attachments: pdf});  
  // Delete temp file
  DocsList.getFileById(copyId).setTrashed(true);
}

function test(){
  var sh = SpreadsheetApp.getActive().getSheetByName('FormResponses');
  var headers = getTitlesFromSs(sh);
  var data = sh.getRange(2,1,1,sh.getLastColumn()).getValues().join(',').split(',');
  data[13]="";// empty field background
  data[14]="";// empty field skills
  var e = buildFakeForm(headers,data);
  onFormSubmit(e);
}

function getTitlesFromSs(sh) {
  var headers = sh.getDataRange().getValues().shift();
  for(var n in headers){
//    Logger.log('title '+n+' = '+headers[n]);
  }
  return headers;
}

function buildFakeForm(headers,data){
  var response = {};
  var namedValues = {};
  var values = {};

  for(var n in headers){
    namedValues[headers[n]]= [data[n]];
  }
  response.namedValues = namedValues;
  response.values = data;
  Logger.log(JSON.stringify(response));
  return response; // this object can simulate a form reception. Usage : (for example) onFormSubmit(response); // will do the same as submiting a form...
}

/*  result

 {"namedValues":{"Timestamp":"Fri Sep 12 2014 22:06:29 GMT+0200 (CEST)","Username":"serge","Please select your business entity":"testCol20","Rotation Name":"testCol21","Rotation Category":"testCol4","City":"testCol5","State":"testCol6",
 "Work Environment":"testCol7","Date Available":"testCol8","Is this a recurring ALLEX rotation or a one time only request?":"testCol9","Supervisor name":"testCol10","Supervisor phone number":"testCol11",
 "Supervisor email":"testCol12","Preferred background":"testCol13","Specific skills required":"testCol14","Skills to be developed in this rotation":"testCol15","Knowledge to be gained in the rotation":"testCol16",
 "Project and/or ALLEX Responsibilities":"testCol17","What is the purpose of this ALLEX Requisition Form submission?":"testCol18"},"values":["Fri Sep 12 2014 22:06:29 GMT+0200 (CEST)","serge","testCol2","testCol3",
 "testCol4","testCol5","testCol6","testCol7","testCol8","testCol9","testCol10","testCol11","testCol12","testCol13","testCol14","testCol15","testCol16","testCol17","testCol18","testCol19","testCol20","testCol21"]}
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Google 表单上的空字段替换为字符串 的相关文章

  • Google 表格脚本 - onEdit 和“源”

    我已经努力了几天 试图让脚本发挥作用 在最基本的层面上 我的函数包含以下内容 function onEdit e var changedRange e source getActiveRange 根据谷歌的文档 这似乎是完全合法的用途 ht
  • 使用应用程序脚本 ColumChart Builder 为每个条形图设置单独的颜色

    我试图为使用谷歌应用程序脚本渲染的柱形图上的每个条形设置单独的颜色 我正在使用 setColor color1 color2 color3 方法 然而 这会导致所有条形都设置为 color1 我需要更改什么才能使每个条形颜色不同 我尝试过使
  • 调用未定义的函数 mb_strimwidth

    几个月前 我编写了一个简短的代码 使用mb strimwidth 为了将某些文本精确地放入表格单元格中 请在截断字符串的末尾添加点 现在 经过一段时间后 我尝试执行相同的代码 但出现了以下错误 Fatal error Call to und
  • Json 将字符串中的 & 转换为 \u0026

    我正在尝试从 pdf 中提取文本并将其写入 json 文件 在提取 unicode 字符时 Json 将所有 转换为 u0026 例如我的实际字符串是 1588 代表 它正确打印到 txt 文件 控制台等 但是当我尝试将此字符串打印到 Js
  • Python fuzzywuzzy 错误字符串或缓冲区期望

    我正在使用 fuzzywuzzy 在公司名称 csv 中查找近似匹配项 我正在将手动匹配的字符串与不匹配的字符串进行比较 希望找到一些有用的邻近匹配 但是 我在 fuzzywuzzy 中遇到了字符串或缓冲区错误 我的代码是 from fuz
  • 如何重载Lua字符串下标运算符?

    This debug getmetatable index function s i return s sub i i end 和这个 debug getmetatable index proc lua read 不起作用 Try debu
  • 如何设置一个 C 函数,将用户输入拆分为多个部分,并拆分这些较小的部分?

    我正在尝试开发一个接受一行用户输入的 C 函数 例如这一行 1X 1X 3Y 1Z 1Z 1Z 1Z 2X 2X 编辑 这只是用户输入内容的任意示例 在实际程序中 他们可以输入 1 到 48 个数字字符对之间的任意位置 这个想法是 用户将插
  • Session.getActiveUser.getEmail() 空白?谷歌表格

    我想检查点击该特定按钮的用户 当我以我的帐户登录时单击它时 它运行正常 但如果其他人运行它 它就是空白的 如何获取登录用户的电子邮件 ID 这是我的代码 function check User var ui SpreadsheetApp g
  • Tesseract 无法读取这个极其简单的数字串

    我目前正在用 python 编写一个脚本 需要使用 tesseract 来读取如下数字 仅使用数字和 psm 6 或 7 它输出 5 551 我在其他数字上取得了一些成功 5 700 有效 但这个特定的数字给我带来了很多问题 不幸的是 我的
  • 简单 C 字符串函数上的 Valgrind 错误

    让我们考虑这个简单的测试程序 include
  • java为oracle VARCHAR2返回空字符串值

    我有以下代码 它似乎工作正常 但它不显示 personCode 字符串的任何值 PERSON CODE 是 Oracle 9i 数据库中的 VARCHAR2 我在我的项目中使用 Java SE 1 7 和 ojdbc7 jar 我是 Jav
  • 如何在 C++11 中将 u32string 转换为 int?

    我们怎样才能转换u32string to int在 C 11 中 另外 我应该使用什么方法将此类字符串的一部分转换为int 假设有开始和结束迭代器可用 我试过了 u32string test U 14 cout lt lt atoi tes
  • 使用 Google Apps 脚本将标题样式应用到单词的所有实例

    我在 Google 文档中使用 Google App 脚本 如何编写一个函数来查找某个单词的所有实例并对其应用标题样式 例如 我想要 狗 的每个实例 Cats Dogs Fish 并将 dogs 样式设置为 Heading 2 如下所示 C
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i
  • 将字符串列表转换为字典

    我有一个清单 Tests run 1 Failures 0 Errors 0 我想将其转换为字典 Tests run 1 Failures 0 Errors 0 我该怎么做 Use a Tests run 1 Failures 0 Erro
  • 解析字符串

    我有一个格式为 ABCDEFG 12 34 56 78 90 11 的字符串 我想将这两个用逗号分隔的值分隔成两个不同的字符串 我如何使用 c 语言在 gcc 中做到这一点 一种可能性是这样的 char first 20 second 20
  • 发送电子邮件的 Google Apps 脚本语法错误。无法识别我的问题

    我正在尝试让 Google 工作表从工作簿中另一张工作表的长列表中发送个性化电子邮件 我使用了教程 因为我是所有编码语言的认证新手 但 AppScript 告诉我第 4 行有语法错误 我一生都无法弄清楚我做错了什么 但我确信当由具有这些合法
  • Google Apps 脚本 oauth connect 不适用于 trello

    我一直在尝试使用 oAuth谷歌应用脚 本 https docs google com macros 访问 trello 数据 但 OAuthService API 似乎对 oAuth 服务做出了一些假设 并且 trello 无法以这种方式
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi

随机推荐

  • 如何在 PyQt5 GUI 中运行两个无限循环?

    我正在尝试使用 pyqt5 构建 GUI 在 GUI 中 我需要通过 WiFi 从树莓派摄像头传输视频 我需要将游戏手柄输入发送到树莓派 我的代码如下 import sys time math import cv2 import numpy
  • 在 64 位 x 64 位乘法中使用 Karasuba 算法真的有效吗?

    我在 AVX2 上工作 需要计算 64 位 x64 位 gt 128 位加宽乘法 并以最快的方式获得 64 位高位部分 既然AVX2没有这样的指令 那么我使用Karatsuba算法来提高效率和获得速度是否合理 不会 在现代架构中 Karat
  • 当结果错误时从函数返回默认值

    有没有类似的东西 当出现错误时 该快捷方式不是返回函数的结果 而是返回预定义的值 基本上我想知道是否可以在一行中执行以下操作 fn index gt String let temp some func pass some func retu
  • 在 Java 桌面应用程序中打开 PDF

    是否可以像创建文本文件一样在 Java 桌面应用程序中打开或创建 PDF 文件 从我的搜索中我发现只有使用 web java 才有可能 真的吗 要在桌面默认阅读器中打开现有的 PDF 文件 您可以使用以下代码 File pdf new Fi
  • 使用具有两个表的 SQL 视图在 MS-Access 表单上编辑数据的任何方法

    根据我的阅读 如果要修改的数据仅代表一个表并且数据中包含唯一标识符字段 则应该可以编辑视图描述的数据 据微软称 任何修改都必须仅引用一个基表中的列 当底层记录集基于视图或存储过程合并来自两个表的数据时 是否有人有幸创建了可编辑的 MS Ac
  • AES-256 CBC 在 php 中加密并在 Java 中解密,反之亦然

    JAVA import javax crypto Cipher import javax crypto spec IvParameterSpec import javax crypto spec SecretKeySpec import o
  • 用户定义的 Markdown 中的 Vue 组件

    我需要在由 Markdown 渲染插件生成的 HTML 中实例化零个或多个 Vue 组件 每个组件的数量和属性都在 markdown 中定义 我控制 markdown 插件 instead of normal template syntax
  • 为什么 req.cookies.session 未定义? Firebase + Node + Express

    我正在尝试分配一个生成会话 cookie 以换取提供的 ID 令牌 Here是我正在关注的文档 这是我的客户端登录代码 firebase auth signInWithEmailAndPassword email password then
  • 使用正则表达式从 CSV 中删除多余的引号字符

    我有大量使用双引号作为条目分隔符的 CSV 文件 但某些条目具有相同的字符 如下所示 MAIN 8 PIPE PART B Report 7 我试图匹配额外的 字符 以便我可以将其替换为另一个字符以在文件中读取 我尝试使用正则表达式 但很符
  • 等值区域图未显示输出中的颜色变化

    即使在等值线统计图与geo data和数据框与 data 参数链接等值线图 method 我已经提供了 key on 参数正确并且 列 参数正确 我已从数据框中删除了所有 NULL 值 import pandas as pd from pa
  • 阻止滥用机器人爬行?

    这是一个好主意吗 http browsers garykeith com stream asp RobotsTXT 滥用爬行是什么意思 这对我的网站有什么坏处 并不真地 无论如何 大多数 坏机器人 都会忽略 robots txt 文件 滥用
  • Ftplib ConnectionRefusedError:[Errno 111]连接被拒绝(python 3.5)

    我有一个应该连接到 FTP 的脚本 from ftplib import FTP with FTP IP as ftp ftp login user my user passwd my password ftp cwd MY DIR ftp
  • 搜索小部件,空指针?

    您好 在我的应用程序中实现搜索小部件时遇到问题 它似乎无法找到菜单项的 actionview 但它找到该项目就好了 我四处寻找答案 但没有看到明确的解决方案 这是我在 XML 中声明的菜单 menu menu
  • 如何在设计视图中打开Java窗体?

    我在互联网上找到了这段代码 我正在我的新笔记本电脑上设置一个新的 Eclipse 我希望能够在设计视图中打开它 如何在设计视图中打开带有 JComponents 的类 是否有办法将其设为默认值 看起来很简单 但我一直在 Eclipse 中寻
  • 多CPU、多核、超线程有什么区别?

    谁能向我解释一下多CPU 多核和超线程之间的区别 我总是对这些差异以及不同场景下每种架构的优缺点感到困惑 这是我在网上学习和参考别人的评论后目前的理解 我认为超线程是其中最劣质的技术 但是便宜 其主要思想是重复寄存器以节省上下文切换时间 多
  • sqlite 按总和过滤

    我有一个包含 1000 条记录的数据库 每行包含文件名和文件大小 如果所有文件大小的总和超过特定限制 则 我需要创建一个 sql 查询来删除所有剩余的行 从最旧到最新 有什么建议么 谢谢 假设这样创建了一个表 CREATE TABLE Fi
  • 在 csv 中写入数据帧时,“‘EncodeElement’中未实现类型‘列表’”

    我有下面的数据框 df Place Name Places abc delhi bcd mumbai delhi cde chennai hyderabad delhi def mumbai efg bangalore mumbai ghi
  • 动态获取数据表中$Columns数组中的列名

    首先我会提到我想要实现的目标 我正在使用 PHP 的 CodeIgniter 框架 我的数据库中有 5 个表 我想通过单击显示页面上的按钮以数据表格式显示它们 我使用服务器端处理 php 作为数据源 因此 一开始我编写了仅以数据表格式显示一
  • 使用一个数字数据成员定义类的所有比较运算符的便捷方法?

    如果我有一个由单个数字数据成员组成的类型 例如 int 和各种方法 有没有一种方便的方法告诉编译器自动生成所有明显的比较运算符 即 而不是这个 使用inline代替constexpr当然 对于 C 03 class MyValueType
  • 将 Google 表单上的空字段替换为字符串

    这段代码效果很好 提交表单后 它会自动填充我创建的模板 然后将其发送到我的电子邮件 除非用户在表单上留下空白字段 否则这非常有效 如果是这样的话 自动填充的顺序是错误的 如果用户决定将字段留空 是否可以自动包含文本 例如 未指定 如果用户输