在Google脚本中以编程方式创建触发器

时间:2018-07-11 11:40:38

标签: google-apps-script google-sheets

我正在制作(或尝试制作)向新客户发送明细表的脚本。我们的想法是,为了避免人们输入错误的信息不断上升的趋势,我们可以与他们共享如下电子表格:

Team Details Spreadsheet

然后,如果每个详细信息电子表格都附加了脚本,则每当有人更改其详细信息时,它都可以自动复制到我们的数据库中(驱动器上的另一个Google表格)。

我认为最简单的方法是制作一个为每个新客户复制并重命名的模板。这也意味着Details Spreadsheet所需的任何脚本都将从模板中复制(我制作了一个名为copyDetails的脚本)。十分简单!除此之外,我需要以编程方式构建一个onEdit触发器,并且对我一生来说,我无法弄清楚这是不可能的还是我做错了。

因此,我的第一个通话目的地当然是the documentation。其中有一个示例和有用的行“要从独立脚本创建此触发器,只需将SpreadsheetApp.getActive()替换为对SpreadsheetApp.openById(id)的调用”

所以我尝试了。我有这个脚本:

var folder = DriveApp.getFolderById("1Ay2f9wnsc8p7_eJIn6Hov0XN4Y_mArm5");
var NewSheetID = DriveApp.getFileById("1X6zFGFoa4C4WvrdNOodbME9vY92lo_oPARUkX7Vfskk").makeCopy(AppNum + ' Details', folder).getId();
Logger.log(NewSheetID);

ScriptApp.newTrigger("copyDetails").forSpreadsheet(SpreadsheetApp.openById(NewSheetID)).onEdit().create();

我运行了脚本,新的电子表格上没有触发器。但是在运行脚本的项目中,现在有一个copyDetails触发器!那是50%的成功。为什么在源工作表而不是目标工作表上显示它?因此,我进行了更深入的研究,显然forSpreadsheet()应该具有目标工作表的ID,而不是“ openById”。好的,所以我将最后一行更改为:

ScriptApp.newTrigger("copyDetails").forSpreadsheet(NewSheetID).onEdit().create();

仍然没有骰子。结果相同。因此,我准确地复制了示例,注释和所有内容,并意识到它需要目标工作表为活动工作表。所以,好的:

  1. 添加了新行以使NewSheetID成为活动工作表
  2. 将示例脚本完全复制到我的脚本中。

仍然得到完全相同的结果。目前,我认为Google已将其设置为以这种方式工作。无论您输入什么表ID,它都会在运行脚本的项目中触发。但这似乎有点愚蠢。为什么要打扰如此有限的东西?

所以这就是我现在所在的位置。我想我的问题是:

  1. 我只是搞砸了吗?我会说我只是一个发烧级的程序员,而我完全有可能把某些地方弄错了。
  2. 如果我没有搞砸,但实际上这是可行的方法,是否有办法设置onEdit触发器以从脚本中复制文件?

我考虑过向模板添加一个onOpen触发器,然后在该函数中检查ScriptApp.getProjectTriggers()以查看是否已为copyDetails()设置了触发器,然后设置一个触发器(如果没有)。但这显然没有所需的权限。您需要一个可安装的触发器来检查ScriptApp.getProjectTriggers(),然后我们回到了开始的地方。我可以跳过对ScriptApp.getProjectTriggers()的检查,但是我不喜欢每次有人打开文件时都设置新的onEdit触发器的想法-我觉得那样会导致大量的不必要的触发器。

对不起,我感到抱歉,但是我觉得细节多于少。在这一点上,我只是个主意。任何帮助将不胜感激。

0 个答案:

没有答案