在不提交表单的情况下触发 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。记住电子表格总是有二维数组。

我在空白电子表格中设置了以下代码以在编辑时运行,它将值带入单元格 a1b1。它有过多的变量只是为了说明正在发生的事情。您显然可以减少这些,但最终我认为这会为您提供您正在寻找变量 TimestampNAME 的值。

/**
 * @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 表单验证

如何在不提交表单的情况下使用struts2提交标签作为按钮?

表单提交触发器无法正常工作

如何获取将在不提交的情况下提交的所有表单值[重复]

如何在不重新加载的情况下提交表单? [复制]

不提交表单的 MVC 表单验证