在提交表单时无法触发 Google 电子表格功能
Having trouble triggering a Google spreadsheet function on Form Submission
我创建了一个 Google 表格,该表格链接到包含两个 sheet 的 Google 传播sheet。我还在 Google 脚本中创建了一个函数,称为 "handleFormSubmission",当触发时(在提交链接表单时):
创建一个变量,其中包含来自 sheet 的此提交的值:var s0Row = s0.getRange("A"+(s0Last)+":J"+(s0Last)).getValues();
然后,如果在两个 sheet 上都满足匹配 ID 条件,则将 sheet 中的那些值设置到 sheet 二上的适当范围内: s1Row.setValues(s0Row);
可能有更好的方法来做到这一点,但目前当 运行 来自 Google 脚本并且表单将提交返回给 sheet 时,该功能可以正常工作。
我遇到的问题是在提交链接表单后触发此函数。我已尝试设置此触发器,如下面的屏幕截图所示。
代码
function handleFormSubmission() {
var ss = SpreadsheetApp.openById("1FmArzo50IV2Wmykgsa89l_EARjzkiyeFDoPaCjGyBZM");
SpreadsheetApp.setActiveSpreadsheet(ss);
var sheet = SpreadsheetApp.getActive();
var s0 = sheet.getSheets()[0];
var s0Last = s0.getLastRow();
var s1 = sheet.getSheets()[1];
var s1Last = s1.getLastRow();
var s0Bid = s0.getRange(s0Last, 10).getValue();
var s0Row = s0.getRange("A"+(s0Last)+":J"+(s0Last)).getValues();
for (var i = 2; i < s1Last + 1; i++) {
var s1Bid = s1.getRange(i, 10).getValue();
var s1First = s1.getRange(i, 2).getValue();
var s1LastName = s1.getRange(i, 3).getValue();
var s1Row = s1.getRange("A"+(i)+":J"+(i));
if (s0Bid === s1Bid) {
Logger.log(i + " " + s1First + s1LastName);
Logger.log("s0: " + s0Bid);
Logger.log("s1: " + s1Bid);
Logger.log("Match!");
s1Row.setValues(s0Row);
Logger.log("----------------------");
break;
} else {
Logger.log(i + " " + s1First + s1LastName);
Logger.log("s0: " + s0Bid);
Logger.log("s1: " + s1Bid);
Logger.log("Nope...");
Logger.log("----------------------");
}
};
};`
当前项目的触发器
我认为事件应该是 "From form" 而不是 "From spreadsheet"。那是因为您正在使用从电子表格打开的脚本编辑器。当您从表单打开脚本编辑器并在该编辑器中编写函数时,它会填充。希望对您有所帮助!
这绝对是您要截获的传播sheet 事件,尽管这看起来有悖常理。
我遇到了同样的问题并通过删除触发器、创建新版本的脚本然后重新创建触发器解决了这个问题。不知道它为什么有效 -- 也许 GAppsScript 专家可以向我们解释一下。
此外,为什么不从事件对象中获取表单提交值?因此,与其搜索 sheet[0] 的最后一行(在极端情况下,这可能不是您要查找的提交,而是下一个),您可以访问所需的字段从事件对象使用以下之一:
e.values
(表单值的数组,按照它们在分布中出现的顺序排列sheet)
e.namedValues
(一个dictionary/hash的表格值)
我创建了一个 Google 表格,该表格链接到包含两个 sheet 的 Google 传播sheet。我还在 Google 脚本中创建了一个函数,称为 "handleFormSubmission",当触发时(在提交链接表单时):
创建一个变量,其中包含来自 sheet 的此提交的值:
var s0Row = s0.getRange("A"+(s0Last)+":J"+(s0Last)).getValues();
然后,如果在两个 sheet 上都满足匹配 ID 条件,则将 sheet 中的那些值设置到 sheet 二上的适当范围内:
s1Row.setValues(s0Row);
可能有更好的方法来做到这一点,但目前当 运行 来自 Google 脚本并且表单将提交返回给 sheet 时,该功能可以正常工作。
我遇到的问题是在提交链接表单后触发此函数。我已尝试设置此触发器,如下面的屏幕截图所示。
代码
function handleFormSubmission() {
var ss = SpreadsheetApp.openById("1FmArzo50IV2Wmykgsa89l_EARjzkiyeFDoPaCjGyBZM");
SpreadsheetApp.setActiveSpreadsheet(ss);
var sheet = SpreadsheetApp.getActive();
var s0 = sheet.getSheets()[0];
var s0Last = s0.getLastRow();
var s1 = sheet.getSheets()[1];
var s1Last = s1.getLastRow();
var s0Bid = s0.getRange(s0Last, 10).getValue();
var s0Row = s0.getRange("A"+(s0Last)+":J"+(s0Last)).getValues();
for (var i = 2; i < s1Last + 1; i++) {
var s1Bid = s1.getRange(i, 10).getValue();
var s1First = s1.getRange(i, 2).getValue();
var s1LastName = s1.getRange(i, 3).getValue();
var s1Row = s1.getRange("A"+(i)+":J"+(i));
if (s0Bid === s1Bid) {
Logger.log(i + " " + s1First + s1LastName);
Logger.log("s0: " + s0Bid);
Logger.log("s1: " + s1Bid);
Logger.log("Match!");
s1Row.setValues(s0Row);
Logger.log("----------------------");
break;
} else {
Logger.log(i + " " + s1First + s1LastName);
Logger.log("s0: " + s0Bid);
Logger.log("s1: " + s1Bid);
Logger.log("Nope...");
Logger.log("----------------------");
}
};
};`
当前项目的触发器
我认为事件应该是 "From form" 而不是 "From spreadsheet"。那是因为您正在使用从电子表格打开的脚本编辑器。当您从表单打开脚本编辑器并在该编辑器中编写函数时,它会填充。希望对您有所帮助!
这绝对是您要截获的传播sheet 事件,尽管这看起来有悖常理。
我遇到了同样的问题并通过删除触发器、创建新版本的脚本然后重新创建触发器解决了这个问题。不知道它为什么有效 -- 也许 GAppsScript 专家可以向我们解释一下。
此外,为什么不从事件对象中获取表单提交值?因此,与其搜索 sheet[0] 的最后一行(在极端情况下,这可能不是您要查找的提交,而是下一个),您可以访问所需的字段从事件对象使用以下之一:
e.values
(表单值的数组,按照它们在分布中出现的顺序排列sheet)e.namedValues
(一个dictionary/hash的表格值)