2012-12-29 40 views
0

这应该是简单的,但我卡在这个脚本... 它有一个功能(createnewsheet),其手动运行在一个时间触发,所以我不得不选择openById()到访问电子表格,但当我查看表格并手动运行该功能时,我想将新创建的表格设置为活动状态,这就是我造成的麻烦。电子表格脚本触发运行和手动

当我从脚本编辑器运行函数(createnewsheet)时,一切都很好,但是当我从电子表格菜单中调用它时,出现以下错误消息:Specified sheet must be part of the spreadsheet,因为最后一行代码。 AFAIK我不是在我的电子表格之外寻找一张表... 任何想法我在这方面做错了什么?

下面是一个简单的代码,显示问题,一个shared copy is available here

var ss = SpreadsheetApp.openById('0AnqSFd3iikE3dGVtYk5hWUZVUFNZMzAteE9DOUZwaVE'); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var sh = ss.getSheetByName('master') 
    var logsheet = ss.getSheetByName('logger') 
    var FUS1=new Date().toString().substr(25,6)+":00"; 

function onOpen() { 
    var menuEntries = [ {name: "Manual test", functionName: "createnewsheet"}, 
         ]; 
    sheet.addMenu("Utilities",menuEntries); 
    SpreadsheetApp.setActiveSheet(logsheet);// this is working fine 
    } 

function createnewsheet(){ 

    var sheetName = "Control on "+ Utilities.formatDate(new Date(), FUS1, "MMM-dd-yy") 
     try{ 
    var newsheet = ss.insertSheet(sheetName,2);// creates the new sheet in 3rd position 
     }catch(error){ 
     FUS1=new Date().toString().substr(25,6)+":00"; 
     var newsheet = ss.insertSheet(sheetName+' - '+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),2);// creates the new sheet with a different name if already there 
     } 
    newsheet.getRange(1,1).setValue(sheetName); 
    SpreadsheetApp.setActiveSheet(ss.getSheets()[2]);// should make 3 rd sheet active but works only when run from script editor 
// SpreadsheetApp.setActiveSheet(newsheet);// should have same result but works only when run from script editor 
} 

回答

1

我找到了一个切实可行的解决办法,以解决我的使用案例:我用不同的功能从菜单(在至极我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); 
} 
0

这里有一个catch

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

当您从脚本编辑器中运行它,它会自动获取集装箱电子表格并使所述表单处于活动状态,但从“自定义菜单”或触发器中运行它时不是这种情况。 修改此声明:

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

感谢您的关注,但此解决方案无法满足我的要求:电子表格打开时,它对UI没有任何影响。我想要的是当我手动运行该功能时能够获得工作表'激活'。 –

+0

是的,这似乎是在更新Google电子表格UI时引入的错误。早些时候这用于工作。对不起,在发布之前不要测试代码。 –

+0

不用担心;-)与此同时,我找到了一种方法,使其工作...查看编辑 –

0

我已经找到了最好的解决办法是补种sheetgetActiveSpreadsheet()目前认识到电子表格中使用所以没必要openById一次,但

// 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 

我认为这表明原来sssheet缓存了电子表格,以存储和它们指针不会刷新,以反映结构变化。我尝试将.flush()作为快捷方式,但似乎是从脚本刷新到表单,而不是相反。

+0

这实际上是您的两个功能解决方案的捷径 - 关键是将'sheet'重新分配给活动工作表 – Jonathon

相关问题