从表单绑定脚本中创建并绑定onEdit脚本到电子表格

时间:2016-10-29 20:40:16

标签: google-apps-script

我对此代码有点麻烦,这是一个绑定在Google表单中的脚本,并在表单提交时触发:

function onFormSubmit(e) {

  //these lines are to get the email address that was entered into the form
  var familyResponses = e.response.getItemResponses();
  var familyEmailAddress = familyResponses[0].getResponse();

  //this loads the template spreadsheet
  templateSpreadsheetFile = DriveApp.getFileById("xxxxxxxx");

  //this generates an 8-digit random number
  var eightDigitCode = Math.floor(Math.random() * (99999999 - 10000000 + 1)) + 10000000;

  //this makes a copy of the template spreadsheet, with the 8-digit code as the name of the copy, in the specified folder.
  var FamilyWorksheetsFolder = DriveApp.getFolderById("yyyyyyyy");
  var newSpreadsheetFile = templateSpreadsheetFile.makeCopy(eightDigitCode, FamilyWorksheetsFolder);
  newSpreadsheetFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT); //this allows anyone with the link to view+edit the new file

  //now we need to add a script to the new spreadsheet, that makes a copy every time it is edited
  ScriptApp.newTrigger('familyWorksheetScript')
      .forSpreadsheet(newSpreadsheetFile)
      .onEdit()
      .create();

  //these lines build the subject and body of the email
  var emailSubject = "link to your worksheet";
  var emailBody = "Here is the link to your worksheet: \n" + newSpreadsheetFile.getUrl() + "\n\n\
Your spreadsheet is named with your unique 8-digit code " + eightDigitCode

  //send the email
  GmailApp.sendEmail(familyEmailAddress, emailSubject, emailBody);

}

function familyWorksheetScript() {  
}

============================================== < / p>

这里的想法非常简单:

  1. 家庭填写表格(一个问题:您的电子邮件地址是什么?)并提交
  2. onFormSubmit脚本运行(安装触发器),获取电子邮件地址,生成随机的8位数代码,制作模板电子表格的副本,副本以8位代码命名。将它放在正确的文件夹中,并设置权限。
  3. 然后通过电子邮件向家人发送电子表格链接
  4. 以上所有作品。但我现在想在这个表单绑定脚本中添加该功能,以创建一个绑定到新电子表格的编辑后触发脚本(模板副本,以8位代码命名)。这是我无法开展工作的部分。它是ScriptApp.newTrigger代码块,当我发表评论时,整个脚本运行正常我最后收到了电子邮件。但是当我在ScriptApp.newTrigger代码中取消注释时,脚本就会在该位置死亡。我可以告诉它在那里死亡,因为新的电子表格仍然被创建,但电子邮件没有被发送。我不知道为什么它不工作,我不知道如何解决它。

    非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您无法在作为新工作表用户的工作表上创建触发器,您创建的所有内容都属于您!触发的函数将作为“你”运行,而不是新用户。

我建议使用UI来创建“onOpen”函数,该函数会要求新用户单击“按钮”以运行将创建onEdit触发器的函数,并要求他们进行显式授权。 / p>

修改

下面是一个示例代码,其中有一个onEdit触发器,用于处理活动电子表格的副本,仅用于测试目的。

function createNewCopy(){
  var ss = SpreadsheetApp.getActive();
  var newSs = DriveApp.getFileById(ss.getId()).makeCopy('copyOf-'+ss.getName());
  var nSs = SpreadsheetApp.openById(newSs.getId());
  var trigger = ScriptApp.newTrigger('onEdit').forSpreadsheet(nSs.getId()).onEdit().create();
}

原始SS中的onEdit就这么简单,只是为了检查它的工作原理:

function onEdit(){
  Browser.msgBox('hello');
}

请注意,电子表格的脚本编辑器资源选项卡中不会显示任何触发器,它只会显示在您自己的Google帐户中自己触发的功能列表中。