根据表单响应将标签添加到Google表格

时间:2015-10-20 14:19:55

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

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

  1. 打开表单 - 已完成
  2. 打开电子表格 - 已完成
  3. 表单以适当的格式将响应保存到电子表格 - 已完成
  4. 将表单回复设置为变量 - 已完成
  5. 将表单问题设置为变量 - 已完成
  6. 在for循环中找到“变更位置”问题 - 已完成
  7. 根据“变更位置”
  8. 的值,在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 个答案:

答案 0 :(得分:2)

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

您已经开始命名函数onSubmit(),这意味着它是某种类型的表单提交触发器功能。只要您打算在到达时处理表单回复,这就是正确的方法。这些触发函数有两种风格,而且你不清楚它是什么意思,所以你需要在那里做出决定。

使用Event对象的属性

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

您的功能目前还没有使用Event对象,但它应具有直接的好处:在您的初始脚本中,您正在对表单和电子表格的ID进行硬编码,但您并不需要到。

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

如果您的脚本是 Google表单表单使用事件参数e提交提交事件:

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

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

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

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

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

根据输入数据

在特定工作表中存储响应
  

为了处理第7步,我原来的想法是在我的for循环中基于表单响应创建一个for循环,然后在for循环中创建一个if / else语句来创建一个新标签,如果它没有'存在并将值保存到该工作表,否则只需将值添加到适当的选项卡名称。

这里的语言有点令人困惑,但这就是我理解的含义:在目标电子表格中选择一个目标表并添加新的响应,具体取决于对#34的响应;变革的位置"是。暂时不要担心循环等细节。

从我们已经看过的有关Event对象的内容中,您可以使用所需的所有操作信息。例如,在 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;
}

表格替代

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

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