Google apps script 使用触发器手动运行的电子表格脚本

Google apps script 使用触发器手动运行的电子表格脚本,google-apps-script,Google Apps Script,这应该是简单的,但我被困在这个脚本。。。 它有一个函数(createnewsheet),可以在时间触发器上手动运行和,因此我必须选择openById()来访问电子表格,但当我查看工作表并手动运行该函数时,我想将新创建的工作表设置为活动状态,这就是造成我麻烦的原因 当我从脚本编辑器运行函数(createnewsheet)时,一切正常,但当我从电子表格菜单调用它时,我会收到以下错误消息:由于最后一行代码,指定的工作表必须是电子表格的一部分。好了,我不是在我的电子表格外写表格。。。你知道我在这方面做错

这应该是简单的,但我被困在这个脚本。。。 它有一个函数(createnewsheet),可以在时间触发器上手动运行,因此我必须选择
openById()
来访问电子表格,但当我查看工作表并手动运行该函数时,我想将新创建的工作表设置为活动状态,这就是造成我麻烦的原因

当我从脚本编辑器运行函数(createnewsheet)时,一切正常,但当我从电子表格菜单调用它时,我会收到以下错误消息:
由于最后一行代码,指定的工作表必须是电子表格的一部分。好了,我不是在我的电子表格外写表格。。。你知道我在这方面做错了什么吗

下面是一个显示问题的简化代码

这里有一个陷阱

SpreadsheetApp.setActiveSheet(ss.getSheets()[2]);
当您从脚本编辑器运行它时,它会自动获取容器电子表格并激活所述工作表,但当您从自定义菜单或触发器运行它时,情况并非如此。 将此语句修改为:

ss.setActiveSheet(ss.getSheets()[2]);
ss.setActiveSheet(newsheet);

我找到了一个解决我的用例的实用方法:我使用菜单中的不同函数(在其中I
setActive()
我想要的工作表)并从这个函数调用主函数。 当从触发器调用时,设置任何活动工作表都没有用,所以我从主函数中删除了这个部分

事情是这样的:

function manualTest(){ // from the ss menu
    createnewsheet();
    var sheet = SpreadsheetApp.getActiveSpreadsheet();
    SpreadsheetApp.setActiveSheet(sheet.getSheets()[2]);// this works from the menu when ss is open
}

function createnewsheet(){ // from the trigger and from function manualTest()
    var sheetName = "Control on "+ Utilities.formatDate(new Date(), FUS1, "MMM-dd-yy");
      try{ 
    var newsheet = ss.insertSheet(sheetName,2);
      }catch(error){
        FUS1=new Date().toString().substr(25,6)+":00";
        var newsheet = ss.insertSheet(sheetName+' - '+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),2);
        }
    newsheet.getRange(1,1).setValue(sheetName);
}

我找到的最佳解决方案是重新设定
工作表的种子
getActiveSpreadsheet()
识别当前使用的电子表格,因此无需再次打开byid,但

//  SpreadsheetApp.setActiveSheet(ss.getSheets()[2]);
//  SpreadsheetApp.setActiveSheet(newsheet);
sheet = SpreadsheetApp.getActiveSpreadsheet(); // reloads the active sheet (including changes to the Sheets array)
sheet.setActiveSheet(sheet.getSheets()[2]); // works as expected from editor and custom menu

我认为这表明原始的
ss
sheet
已经将电子表格缓存到内存中,并且它们的指针没有刷新以反映结构更改。我尝试使用.flush()作为快捷方式,但这似乎是从脚本刷新工作表的一种方式,而不是相反的方式。

感谢您的关注,但此解决方案无法满足我的要求:打开电子表格时,它对UI没有影响。我想要的是,当我手动运行该功能时,能够使工作表处于“活动”状态。是的,这看起来像是谷歌电子表格用户界面更新时引入的错误。早些时候,这种方法曾经奏效。很抱歉在发布之前没有测试代码。不用担心;-)与此同时,我找到了一种方法让它工作……请参阅edit,它是实现双功能解决方案的有效快捷方式-关键是将
工作表
重新分配到活动工作表
//  SpreadsheetApp.setActiveSheet(ss.getSheets()[2]);
//  SpreadsheetApp.setActiveSheet(newsheet);
sheet = SpreadsheetApp.getActiveSpreadsheet(); // reloads the active sheet (including changes to the Sheets array)
sheet.setActiveSheet(sheet.getSheets()[2]); // works as expected from editor and custom menu