执行失败:您无权调用getProjectTriggers [英] Execution failed: You do not have permission to call getProjectTriggers

查看:225
本文介绍了执行失败:您无权调用getProjectTriggers的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Javascript和谷歌应用程序很陌生,但是慢慢找到我的脚(有帮助)



我写了一个脚本来完成各种各样的事情,这个脚本正在安装一个触发器。这是它。

  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('匹配触发器的数量'+ j);

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

以下是我遇到的问题。



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

 执行失败:您无权调用getProjectTriggers 

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



我目前拥有电子表格,但理想情况下,我希望与人员分享,触发器安装和工作。 b
$ b

有什么想法?

解决方案


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





< img src =https://i.stack.imgur.com/hTRTE.jpgalt =在这里输入图片描述>






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



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

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

var items = [
{name:'Refresh TOL Notes',functionName:'getNotes'},
null,//结果在行分隔符中。
{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()
}


函数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('匹配触发器的数量'+ j);
if(j == 0){
ScriptApp.newTrigger(getNotes).forSpreadsheet(ss).onFormSubmit()。create();




函数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('请运行INSTALL从自定义菜单');
}


I am very new to Javascript and google apps but slowly finding my feet (with help)

I've written a script that does various things, one part of this script, is installing a trigger. Here it is.

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();} 
}

Here is the problem I'm having.

The above code is called in the onOpen() trigger. When I open the sheet, and check logs, my trigger isn't installed and I get the following message.

Execution failed: You do not have permission to call getProjectTriggers

When I run the onOpen() manually. The trigger is installed.

I currently own the spreadsheet, but ideally, i'd like to share it with people and the trigger installs and works.

Any ideas?

解决方案

Following your comment :

Change the name of your function to anything else and create an installable trigger that runs this function on SS open, as mentioned in the doc, simple triggers can't do anything that requires authorization but installable ones do.


Edit : complete example with your code

After saving this in a spreadsheet and setting manually a trigger on open with the specialonOpen function (and accepting the authorization request), I refreshed the browser and get it working with your menu and the new trigger as well (see illustration below -in french because I used another gmail account with old spreadsheet version, my english one has new version and onFormSubmit doesn't work in new versions)

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


EDIT 2 : a solution with a Browser message to suggest install from a menu.

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');
    }

这篇关于执行失败:您无权调用getProjectTriggers的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆