根据表单响应向 Google 个工作表添加标签

Adding Tabs to Google Sheets Based on Form Response

我正在尝试根据为我的一个表单问题选择的值来概念化我的结构和值,以便在 Google Sheet 中组织多个 sheet 中的表单响应响应("Location of Change")。我有一份清单,目前已完成,如下所示。我还列出了额外的步骤以及我认为我需要创建什么来实现我正在寻找的东西。有人可以指导我指出我可能遇到的问题或更好的方法吗?

  1. 打开表单 - 已完成
  2. 打开点差sheet - 已完成
  3. 表单以正确的格式将回复保存到 Spreadsheet - 已完成
  4. 设置对变量的表单响应 - 已完成
  5. 将表单问题设置为变量 - 已完成
  6. 在 for 循环中查找 "Location of Change" 个问题 - 已完成
  7. 根据 "Location of Change"
  8. 的值,在 Google Sheet 秒内获取新选项卡中的回复和分组回复

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

这听起来对吗?我是不是用错了方法?

更新:

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);

  }
}

您的一般思维过程很好,但是您针对用于解决问题的特定对象和方法做出了不恰当的选择。

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

使用事件对象的属性

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

您的函数当前未使用 Event 对象,但它应该会立即带来好处:在您的初始脚本中,您硬编码了 Form 和 Spreadsheet 的 ID,但您没有不需要。

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

如果您的脚本是 Google Forms Form Submit 带有事件参数的提交事件 e:

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

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

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

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

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

根据输入数据在特定 sheet 秒内存储响应

To work on step 7, my original thought is to create a for loop within my for loop based on the form response and then within that for loop create an if/else statement to create a new tab if it doesn't exist and save values to that sheet, otherwise just add values to appropriate tab name.

这里的语言有点令人困惑,但这是我的理解:Select目标sheet在目标范围内传播sheet并附加新的响应,取决于对 "Location of Change" 的响应。 暂时不要担心循环等细节。

从我们已经了解的有关事件对象的内容来看,您可以使用操作所需的所有信息。例如,在 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() 可以简化这一过程。

获取或创建 sheet

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

/**
 * 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 表格的功能。

  • 从您当前的表单开始,使用 Spreadsheet 响应目标。
  • 在传播sheet 中,表单响应通常会转到名为 "Form Responses" 的 sheet,可能后面还有一个数字。
  • 为您感兴趣的类别插入额外的 sheets。在每个类别中,使用 spreadsheet QUERY 函数来 select 响应的子集是相关的。如果您使用公共单元格(例如 A1)来存储类别,然后将 QUERY 函数放在后续行中,引用 A1 中的值,这将得到简化。这样,可以从这个复制额外的 sheets,并通过修改 A1 的内容来调整。