在不提交表单的情况下触发 Google 脚本
Posted
技术标签:
【中文标题】在不提交表单的情况下触发 Google 脚本【英文标题】:Trigger Google script without Form submission 【发布时间】:2021-06-30 16:28:20 【问题描述】:我有一个在表单提交触发器上运行的 Google 脚本。
提交表单时,会将新行添加到链接的电子表格中,并且脚本会运行一些操作来创建新文件夹和 Google 文档。
我想通过 Zapier 而不是表单 sumbission 添加新行来修改这一点。
使用 Zapier 添加新行很容易,
但是,在将脚本触发器设置为 'On form submit' 中的 'On change' 事件时,我得到了错误;
TypeError: Cannot read property '0' of undefined
我认为在使用 e.values
时,脚本期望从表单提交中获得这些,但由于 Zapier 添加的行中不存在它们而失败。
问题: 我不知道如何解决错误并允许脚本在提交表单时以与从 Zapier 添加新行时相同的方式运行? https://i.stack.imgur.com/vJuRw.png
我有什么;
function autoFillGoogleDocFromForm(e)
var Timestamp = e.values[0];
var NAME = e.values[1];
var file = DriveApp.getFileById('1234');
var folder = createNewFolder();
var copy = file.makeCopy(NAME, folder);
var newId = copy.getId();
try
var doc = DocumentApp.openById(newId).addEditor(email);
catch(error)
var doc = DocumentApp.openById(newId);
var body = doc.getBody();
body.replaceText('Name', Name);
doc.saveAndClose();
<!--This creates a Google drive folder -->
function createNewFolder()
var ss = SpreadsheetApp.getActive();
var names = ss.getSheetByName("Sheet1");
var POSNAME = names.getRange(names.getLastRow(),
2).getValue();
var folders = DriveApp.getFoldersByName(NAME);
while (folders.hasNext())
folder = folders.next();
if(folder.getName()==NAME)
return folder;
var parentFolder=DriveApp.getFolderById("1234");
return parentFolder.createFolder(NAME);
【问题讨论】:
onFormSubmit 触发器的事件对象与 onChange 触发器ref 的事件对象完全不同。或者你可以 Logger.log(JSON.stringify(e));并实际查看事件对象。顺便说一句,它只检测用户而不是脚本添加的新行。 【参考方案1】:我认为您在值数组中缺少一个级别,您需要在获取值之前将您的 e
转换为 range
。记住电子表格总是有二维数组。
我在空白电子表格中设置了以下代码以在编辑时运行,它将值带入单元格 a1
和 b1
。它有过多的变量只是为了说明正在发生的事情。您显然可以减少这些,但最终我认为这会为您提供您正在寻找变量 Timestamp
和 NAME
的值。
/**
* @OnlyCurrentDoc
*/
const mySS = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
function onEdit(e)
var theRange = e.range;
var allValues = theRange.getValues();
var singleRowValues = allValues[0];
var firstColumnofRowValue = singleRowValues[0];
var secondColumnofRowValue = singleRowValues[1];
var Timestamp = firstColumnofRowValue;
var NAME = secondColumnofRowValue;
//Test Output
mySS.getRange("A1").offset(0,0,1,2).setValues([[Timestamp,NAME]]);
【讨论】:
OP 要求从 onFormSubmit 到 onChange。 onChange 中没有 e.range。此外,onChange 是一个可安装的触发器。 是的,但是 OP 提到了添加行,所以我猜测这是真正的意图。我们拭目以待。 做到了!非常感谢! @PGSystemTester 啊哈!它确实有效,但只有在工作表中添加行时,我已经看到 other posts 现在关于这不会触发任何 Google API 添加的行。这意味着我的 Zapier 添加的行将不起作用。我在其他帖子中没有看到太多建议有办法解决这个问题,所以可能需要发挥创意,有什么想法吗? @EwanFarry,实际上我有点担心这样的事情,因为事件不能触发其他事件(这可能是一件好事)。我对 Zapier 不是很熟悉,但我对与电子表格相关的表单相关的 Google App Scripts 非常擅长(我认为这是一组被低估的工具)。既然你问我的想法,我建议坚持 onForm Submission 事件并自己使用 GAS 进行编码,或者在工作表中设置一个数组函数来做任何你想做的事情。以上是关于在不提交表单的情况下触发 Google 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何在不通过 jQuery 提交的情况下强制进行 html5 表单验证