在没有提交表单的情况下触发 Google 脚本

Trigger Google script without Form submission

我有一个 Google 脚本,它 运行 在表单提交时触发。

提交表单后,新行会添加到链接的电子表格中,脚本 运行 会执行一些操作来创建新文件夹和 Google 文档。

我想通过 Zapier 添加新行而不是表单汇总来对此进行修改。

使用 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);
    }

我认为您的值数组中缺少一个级别,您需要在获取值之前将 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]]);
}