我写了一个脚本来做各种事情,这个脚本的一部分是安装触发器:
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() 触发器中调用。
当我打开工作表并检查日志时,我的触发器未安装,我收到以下消息。
Execution failed: You do not have permission to call getProjectTriggers
当我手动运行 onOpen() 时。触发器已安装。
我目前拥有该电子表格,但理想情况下,我想与其他人分享它并且触发器安装和工作。
关于如何通过在 onOpen 中调用项目触发器来解决此错误的任何想法?
最佳答案
根据您的评论:
将您的函数名称更改为任何其他名称,并创建一个可安装的触发器,在 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');
}
关于google-apps-script - 执行失败 : You do not have permission to call getProjectTriggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21219031/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json