【问题标题】:Adding Tabs to Google Sheets Based on Form Response根据表单响应向 Google 表格添加标签
【发布时间】:2015-10-20 14:19:55
【问题描述】:

我正在尝试根据为我的一个表单问题响应(“更改位置”)选择的值来概念化我的结构和值,以便在 Google 工作表中组织多个工作表中的表单响应。我有一个清单,到目前为止已完成如下。我还列出了其他步骤以及我认为我需要创建什么来实现我正在寻找的东西。有人可以指导我指出我可能遇到的问题或更好的方法吗?

  1. 打开表单 - 已完成
  2. 打开电子表格 - 已完成
  3. 表单以正确的格式将响应保存到电子表格 - 已完成
  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);

  }
}

【问题讨论】:

  • 你能把这组概念缩小一点吗?您已完成的前 6 个步骤可以通过多种方式完成,这会影响对您提议的下一步的评估。添加一些代码来阐明您现有的“for循环”也是有帮助的。
  • @Mogsdad 感谢您的回复,我更新了我的问题以包含到目前为止的代码。希望这会有所帮助
  • 感谢您进行编辑 - 它非常有帮助! (顺便说一下,你可能想要items[i],而不是items[7]。)

标签: google-apps-script google-sheets google-forms


【解决方案1】:

您的总体思维过程很好,但是您为解决问题所使用的特定对象和方法做出了不恰当的选择。

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

使用 Event 对象的属性

触发器函数响应事件,当它们被调用时,触发器函数会得到一个Event object,其中包含与事件最相关的信息。

您的函数当前未使用 Event 对象,但它应该立即获得好处:在您的初始脚本中,您正在硬编码表单和电子表格的 ID,但您不需要。

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

如果您的脚本是 Google 表单表单提交提交事件,事件参数为 e

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

如果您的脚本是带有事件参数eGoogle 表格表单提交事件:

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

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

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

根据输入数据将响应存储在特定工作表中

要进行第 7 步,我最初的想法是根据表单响应在我的 for 循环中创建一个 for 循环,然后在该 for 循环中创建一个 if/else 语句以创建一个新选项卡(如果它不存在)并将值保存到该工作表,否则只需将值添加到适当的选项卡名称。

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

根据我们已经了解的有关 Event 对象的信息,您可以使用操作所需的所有信息。例如,在 Google Sheets 表单提交触发函数中,您可以这样做:

// 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;
}

表替代

您几乎可以在没有脚本的情况下完成所有这些工作,只需使用 Google 表格的功能。

  • 从您当前的表单开始,使用电子表格响应目标。
  • 在电子表格中,表单响应通常会发送到名为“表单响应”的工作表中,其后可能带有一个数字。
  • 为您感兴趣的类别插入其他工作表。在每个类别中,使用电子表格查询功能选择相关的响应子集。如果您使用公共单元格(例如 A1)来存储类别,然后将 QUERY 函数放在后续行中,这会简化,参考 A1 中的值。这样一来,就可以从这张表中复制更多的表,并通过仅修改 A1 的内容来进行调整。

【讨论】:

  • 谢谢。这非常有帮助!
  • 快速提问。 `var sheet = e.range.getSheet(); 行有错误` 使用您的代码。错误显示TypeError: Cannot read property "range" from undefined. (line 3, file "") 这似乎是由于不知道要访问的 Google Sheet 文件。我的假设是否正确?
  • @cphill 不。这是因为在调试器中运行时未定义 e。见How to test a trigger function in GAS?
  • 我明白了,所以根据您链接的问题中的示例,我需要从函数中删除 e 参数,以标准格式定义 Google 表格,创建一个 for 循环并定义e 和我在那个 for 循环中的 onSubmit 功能。这听起来对吗?我还尝试通过发布“测试作为附加组件”而不运行调试器,但该功能不起作用。
  • 对不起,我已经读了好几遍了,但我不确定我是否明白你在说什么。您的函数名称onSubmit()暗示它是一个触发函数。 (它仍然需要installed 才能在表单响应到达时捕获它们。)您可以从具有模拟 事件的测试函数调用 onSubmit()。你不需要剖析它。
猜你喜欢
  • 1970-01-01
  • 2018-07-31
  • 2019-12-10
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2022-07-08
  • 1970-01-01
相关资源
最近更新 更多