【问题标题】:Execution failed: You do not have permission to call getProjectTriggers执行失败:您无权调用 getProjectTriggers
【发布时间】:2014-01-19 15:56:51
【问题描述】:

我写了一个脚本来做各种事情,这个脚本的一部分是安装一个触发器:

function setTrigger() { 
var ss = SpreadsheetApp.getActive();
var triggers = ScriptApp.getProjectTriggers();
Logger.log('Amount of triggers ' +triggers.length);


var j = 0;
for (var i = 0 ; i < triggers.length;i++){

if(triggers[i].getHandlerFunction() == 'getNotes' ){j++;}

}

Logger.log('Amount of matching triggers ' +j);

if(j == 0 ){ScriptApp.newTrigger("getNotes").forSpreadsheet(ss).onFormSubmit().create();} 
}

这是我遇到的问题。

以上代码在onOpen() 触发器中调用。 当我打开工作表并检查日志时,我的触发器没有安装,我收到以下消息。

执行失败:您无权调用 getProjectTriggers

当我手动运行onOpen() 时。触发器已安装。

我目前拥有该电子表格,但理想情况下,我想与人们分享它,并且触发器安装和工作。

任何想法如何通过在onOpen 中调用项目触发器来解决此错误?

【问题讨论】:

  • 当您说“上面的代码在 onOpen() 触发器中被调用”时,您是指一个名为“onOpen”的函数还是您为其安装了触发器并在 open 上运行的函数?请看一下这个文档:developers.google.com/apps-script/…
  • @Sergeinsas 感谢您的回复和链接。我已使用此链接中的一些信息来构建我的脚本。我的意思是我已经按照链接说明在脚本顶部创建了一个名为 onOpen() 的函数。它建立一个菜单,然后检查触发器,如果​​没有找到它应该安装它。这是 onOpen() 代码,我想我应该首先包含它。 jsfiddle.net/8gU9m

标签: google-apps-script google-sheets triggers


【解决方案1】:

关注您的评论:

将您的函数名称更改为其他任何名称,并创建一个可安装的触发器,该触发器在 SS 打开时运行此函数,如 the doc 中所述,简单的触发器不能执行任何需要授权的操作,但可安装的触发器可以。


编辑:使用您的代码完成示例

将其保存在电子表格中并使用 specialonOpen 函数手动设置打开触发器(并接受授权请求)后,我刷新了浏览器并使其与您的菜单和新触发器一起工作(见下图 -在法语中,因为我使用了另一个带有旧电子表格版本的 gmail 帐户,我的英文帐户有新版本并且 onFormSubmit 在新版本中不起作用)

function specialonOpen() {
  var ss = SpreadsheetApp.getActive();

  var items = [
    {name: 'Refresh TOL Notes', functionName: 'getNotes'},
    null, // Results in a line separator.
    {name: 'Coming Soon!', functionName: 'menuItem2'}
  ];
  ss.addMenu('TOL Toolkit', items);  
  var sheet = ss.getSheetByName('New Notes');
  if (sheet == null) {var ss = SpreadsheetApp.getActive();
                      ss.insertSheet('New Notes',0 );

                      var sheet = ss.getSheetByName('New Notes');
                      sheet.deleteColumns(3, 18);
                      sheet.deleteRows(12, 88 );
                      sheet.getRange('a1').setValue('Agent Name');
                      sheet.getRange('b1').setValue('Tol Notes');
                      getNotes();

                      sheet.setColumnWidth(1, 120);
                      sheet.setColumnWidth(2, 400);
                      setTrigger()              }


  getNotes();        
  setTrigger()
}


function setTrigger() {
  var ss = SpreadsheetApp.getActive();
  var triggers = ScriptApp.getProjectTriggers();
  Logger.log('Amount of triggers ' + triggers.length);
  var j = 0;
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == 'getNotes') {
      j++;
    } 
  }
    Logger.log('Amount of matching triggers ' + j);
  if (j == 0) {
    ScriptApp.newTrigger("getNotes").forSpreadsheet(ss).onFormSubmit().create();
  }
}


function getNotes() {
  var s = SpreadsheetApp.getActive();
  var sheet1 = s.getSheetByName('New Notes');
  if (sheet1 == null) {
    var s = SpreadsheetApp.getActive();
    s.insertSheet('New Notes', 0);
    var sheet1 = s.getSheetByName('New Notes');
    sheet1.deleteColumns(3, 18);
    sheet1.deleteRows(12, 88);
    sheet1.getRange('a1').setValue('Agent Name');
    sheet1.getRange('b1').setValue('Tol Notes');    
    sheet1.setColumnWidth(1, 120);
    sheet1.setColumnWidth(2, 400);   
  }
}


编辑 2:带有浏览器消息的解决方案,建议从菜单安装。

function onOpen() {
  var ss = SpreadsheetApp.getActive();

  var items = [
    {name: 'Install this script', functionName: 'setTriggers'},
  ];
    ss.addMenu('Custom Menu', items);  
    Browser.msgBox('please run INSTALL from the custom menu');
    }

【讨论】:

  • @Sergeinas 感谢您的回复。所以如果我理解正确的话。我是否应该将 onOpen() 完全重命名为其他名称。然后通过脚本编辑器中的触发器菜单手动安装触发器。那么有没有办法通过脚本安装触发器呢?因为它需要授权(对不起,如果我在这里很愚蠢。但这对我来说是全新的)
  • 不,脚本可以创建触发器,我所说的只是将启动您的 onOpen 函数的 opOpen(实际上它应该有另一个名称,正如我解释的那样)。如果不清楚,请告诉我。
  • 嘿,我真的很抱歉,但不是 100% 清楚 :$ 如果你想放弃,我不怪你。我已经更改了代码并将功能拆分。 jsfiddle.net/33xRG 因为我已将 onOpen() 更改为 onMyOpen(),所以除非我手动设置,否则它不会加载菜单。 setTrigger() 在手动运行时确实有效,但在打开工作表时无效。我希望在加载工作表时做的事情,也许这是不可能的:菜单已创建。 getNotes() 运行,然后检查表单提交时是否存在触发器。虽然我是这些床单的所有者,但大约有 5 人使用它们,我希望通过这个来节省它们的所有时间。
  • 我想我还不够清楚......对此感到抱歉。我会用一个例子来编辑我的答案,我想这比超长的 cmets 更能帮助你......给我几分钟。
  • @Sergeinas 我真的很感激,我欠你一杯啤酒!我不明白为什么它 setTrigger 不能在 onOpen 上工作。但是当我手动运行它时很好。并且脚本已经有权运行,正如我所做的那样:s。 PS你可能已经足够清楚了,我猜我只是适量的愚蠢。但我正在努力并取得进展:)
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2022-01-07
  • 2012-09-14
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多