当前位置: 首页 > 知识库问答 >
问题:

基于表单响应向Google工作表添加选项卡

龚凯泽
2023-03-14

我试图概念化我的结构和值,以组织表单中的多个表中的表单响应基于我的表单问题响应之一(更改的位置)选择的值。我有一个清单,到目前为止完成如下。我还列出了额外的步骤,以及我认为我需要创造什么来实现我想要的。有人能指导我指出我可能存在的问题或更好的方法吗?

  1. 打开表格-已完成
  2. 打开电子表格-已完成
  3. Form将正确格式的响应保存到电子表格-已完成
  4. 设置对变量的表单响应-完成
  5. 将表单问题设置为变量-已完成
  6. for循环中查找更改位置问题-已完成
  7. 根据更改位置的值在Google工作表中的新选项卡中获取响应和组响应

在第7步中,我最初的想法是基于表单响应在for循环中创建for循环,然后在for循环中创建if/else语句来创建一个新选项卡(如果它不存在),并将值保存到该表中,否则只需将值添加到相应的选项卡名称中即可。

这听起来对吗?我是不是走错了路?

更新:

function onSubmit() {

  //Open Marketing - Discoveries and Changes - v1
  var form = FormApp.openById('id');

  //Open Marketing - Discoveries and Changes - v1
  var sheet = SpreadsheetApp.openById('id');

  //Capture Form Responses
  var formResponses = form.getResponses();

  //Capture Questions 
  var items = form.getItems();

  for (var i in items) {

    var title = items[7].getTitle();
    Logger.log(title);

  }
}

共有1个答案

段干玺
2023-03-14

你的一般思维过程是好的,但是你正在为你用来解决问题的特定对象和方法做出不恰当的选择。

您首先将函数命名为onSubmit(),这意味着它是某种表单提交触发函数。只要您打算在表单响应到达时对其进行处理,这就是正确的方法。这些触发函数有两种风格,不清楚您打算使用哪种,所以您需要在这里做出决定。

触发器函数响应事件,当它们被调用时,触发器函数被赋予一个事件对象,其中包含有关事件的最相关信息。

您的函数目前没有使用事件对象,但它应该使用,这有一个直接的好处:在您的初始脚本中,您正在硬编码表单和电子表格的标识,但您不需要这样做。

根据表单提交触发函数的类型,您可以修改序言以利用表单和电子表格之间的链接,使用调用触发器函数时传递给触发器函数的事件数据。(这假设您已将电子表格与表单链接-对于您的应用程序,这可能不是必需的。)

如果脚本是带有事件参数e的Google Forms表单提交事件:

var form = e.source;
var ssId = form.getDestinationId();
var ss = SpreadsheetApp.openById(sheetId);

如果脚本是带有事件参数e的Google Sheets表单提交事件:

var sheet = e.range.getSheet();
var ss = sheet.getParent();
var form = FormApp.openByUrl(ss.getFormUrl());

使用这两种方法中的任何一种都将产生更具可移植性的代码,因为它们适应所处理事件的上下文。

但这还不是全部...您打开表单的响应也作为事件对象的属性提供!正因为如此,你可能会发现你根本不需要打开表单。

在第7步中,我最初的想法是基于表单响应在for循环中创建for循环,然后在for循环中创建if/else语句来创建一个新选项卡(如果它不存在),并将值保存到该表中,否则只需将值添加到相应的选项卡名称中即可。

这里的语言有点混乱,但我理解它的意思是:在目标电子表格中选择一个目标工作表并附加新的响应,这取决于对“更改位置”的响应是什么。暂时不要担心循环等细节。

从我们已经看到的事件对象来看,您需要操作的所有信息都是可用的。例如,在Google工作表表单提交触发函数中,您可以这样做:

// Choose destination sheet according to Location of Change
var destSheet = getSheet(ss, e.namedValues['Location of Change']);
// Store the current response in destination sheet
destSheet.appendRow(e.values);

通过使用实用程序函数,getSheet()简化了这一过程。

此实用程序函数封装逻辑,以获取对具有给定名称的现有工作表的引用,或者在必要时创建一个。

/**
 * Get the sheet with given name. Create sheet if it doesn't exist.
 * New sheet will be created with optional headings, if provided.
 *
 * From: 
 *
 * @param {Spreadsheet} spreadsheet   Google Spreadsheet object.
 * @param {String}      sheetName     Sheet name to get.
 * @param {String[]}    headings      Optional array of headings (for new sheet).
 *
 * @returns {Sheet}                   Sheet object.
 */
function getSheet( spreadsheet, sheetName, headings ) {
  spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName(sheetName);
  if (sheet == null) {
    // Not found, so add new sheet
    sheet = spreadsheet.insertSheet(sheetName);
    if (headings && headings.constructor === Array) {
      sheet.getRange(1,1,1,headings.length).setValues([headings]);
    }
  }

  return sheet;
}

您几乎可以不用脚本就完成所有这一切,只需使用GoogleSheets的功能即可。

  • 从当前表单开始,使用电子表格响应目标
 类似资料:
  • 我有一个多标签谷歌表。第一个是主表,我有一些基本的位置信息。在其他页面中,我通过“导入”传输这些基本信息,因此我有一些列动态更改,一些是静态的,用户可以更新。尽管如此,如果我在主工作表的数据之间添加一行,它只会更改动态列(从importrange更新),而其余列不会更改-这会影响更新。在主工作表中添加行时,是否有任何方法/脚本可以自动在其他工作表中添加行?

  • 问题内容: 我已经做了一个不错的表格,并使用了一个复杂的“添加”函数来处理它。像这样开始 现在,我真的不想重复该方法中的所有功能,因此我想可以使用完全相同的模板,甚至可以id在表单中添加一个字段,以便该函数知道其正在编辑的内容。但这有几个问题 我将在哪里放置功能?之所以必须在此之后,是因为这是创建文章的地方,但它甚至永远都不会达到那个目的,因为由于唯一的约束,表单是无效的(除非用户编辑了所有内容)

  • 我为我的网站创建了一个AMP页面,在我的桌面浏览器上运行正常,在我的手机上测试正常,如果某些字段为空或无效,提交错误将正确显示错误消息,并且在成功提交时,它将正确显示提交成功消息。 当我将页面提交给Google缓存amp页面时,我再次测试了表单,这次它没有显示错误或成功消息。但如果表单提交有效,它将向我发送电子邮件,但不会显示成功消息。 表单html代码: PHP页面:

  • 我有一个自定义函数,它在工作表中最后一个非空行下插入一个新行,并将特定范围复制到这个新行。当我用自定义菜单项触发它时,这个功能工作正常。 但是,当我将此自定义函数添加到onOpen(e)触发器时,脚本不起作用。我排除了故障,并在我的函数中添加了一个警报——警报会触发,因此函数会在正确的位置读取。 请建议如何让我的脚本在打开时工作? 以下是我的自定义函数代码:

  • 我正在使用GoogleApps脚本将来自GoogleSheets的问题添加到GoogleForm中。列表从两个单独的数组中读取,并作为单独的网格类型问题添加。我还将工作表设置为表单结果的目标。 当我运行脚本时,表单得到了完美的更新。如果要添加10个项目,则在表单中添加10个问题。但是,在链接的表单响应表中,经常会添加标题为“[第1行]”的其他列。每次运行脚本时,附加列的数量及其位置都会发生变化。我

  • 我有一个现有的谷歌表单,希望: 图1。关于谷歌表单的问题。 1) 在现有的谷歌表单上,自动填写表单(第1页,C列)中对问题(你叫什么名字)的回答 图2。谷歌表单数据的去向 2) 每次google表单提交时生成的时间戳,以YYYY-MM-DD格式自动填充(第1页,E列)。 3) 虽然这些谷歌表单响应将被记录在这个电子表格中,但有时我还必须手动进入并在随后的行中输入信息。 这可能吗?我刚开始将谷歌表单