我正在尝试概念化我的结构和值,以便根据为我的某个表单问题回复(“更改位置”)选择的值,在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);
}
}
答案 0 :(得分:2)
您的一般思维过程很好,但您正在针对您用来解决问题的特定对象和方法做出不恰当的选择。
您已经开始命名函数onSubmit()
,这意味着它是某种类型的表单提交触发器功能。只要您打算在到达时处理表单回复,这就是正确的方法。这些触发函数有两种风格,而且你不清楚它是什么意思,所以你需要在那里做出决定。
触发器功能响应事件,当它们被调用时,触发器函数被赋予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表格的功能,您就可以在没有脚本的情况下完成所有这些操作。