2013-06-19 42 views
0

我的用例是我将拥有一个在电子表格中定义的过程的规则列表。这是后端的东西。最终用户将复制一份Google文档,该文档将具有基于规则电子表格内容的动态菜单。我写了一个onOpen函数,它可以从电子表格中读取并创建为表单命名的菜单项。这些菜单项将触发一个处理表单中规则的函数。访问电子表格时,Google Doc onOpen不会触发

我的问题是,从脚本编辑器触发时,onOpen函数可以正确运行,但在文档打开时不会触发。通过玩弄注释,我确定SpreadsheetApp.openById()命令会导致onOpen函数在初始文档加载时失败。当不使用该命令时它将运行。

我已经在函数内部和外部设置了表单定义,并且结果没有区别,所以我相信下面的代码应该可以假设地工作。确实如此,只是在文档打开时不会自动完成。有趣的,对吗?因此,这里是我的文档与代码:

https://docs.google.com/document/d/1dQb5RYntMsbTIxDCh6uEoNur3oOlVisxP7hD_sK3Fsk/edit

,这里是定义菜单项的电子表格:

https://docs.google.com/spreadsheet/ccc?key=0AjR3e-R75aP8dHR0WWpGNF9vdEhvcy12eHJTMmF3aXc#gid=0

// from this spreadsheet, I want function names based on the sheet names 
    var ss = SpreadsheetApp.openById("0AjR3e-R75aP8dHR0WWpGNF9vdEhvcy12eHJTMmF3aXc"); 
    var sheets = ss.getSheets(); 

    function onOpen() { 
     var menu = DocumentApp.getUi().createMenu("Menu Title"); 

     // dynamic menu based on tabs in spreadsheet 
     for (sheet in sheets) { 
      var thisCaption = sheets[sheet].getName(); 
      var thisFunction = "sheet_" + sheet; 
      menu.addItem(thisCaption, thisFunction); 
     } 

     menu.addToUi(); 
    } 


    // I precreate dummy functions based on sheet number 
    function sheet_0() { process_sheet(0); } 
    function sheet_1() { process_sheet(1); } 
    function sheet_2() { process_sheet(2); } 
    function sheet_3() { process_sheet(3); } 
    function sheet_4() { process_sheet(4); } 
    function sheet_5() { process_sheet(5); } 
    function sheet_6() { process_sheet(6); } 
    function sheet_7() { process_sheet(7); } 
    function sheet_8() { process_sheet(8); } 
    function sheet_9() { process_sheet(9); } 


    function process_sheet(sheetNum) { 
     var thisSheet = sheets[sheetNum]; 

     // at this point I do some processing based on the contents of the sheet 
     // for the sake of example, I'll just set the document name to the sheet name 
     var sheetName = thisSheet.getName(); 
     DocumentApp.getActiveDocument().setName(sheetName); 
    } 

回答

2

您不能访问外部文件(电子表格否则)从一个onOpen触发的功能。由于此功能自动运行,无需任何用户授权。它无法访问可能需要授权的API。

我不知道任何解决方法,我想你只需要改变你的方式。也许从一个函数中设置这个动态菜单,用户点击你从onOpen创建的固定菜单。因为当用户点击一个功能时,授权弹出窗口会显示给他,然后你的脚本可以在他的权限下运行,并可以完成他授权的所有事情,这意味着要打开此电子表格,必须与他共享,只有当你有其他用户比你自己时才有意义:)

+0

谢谢Henrique。虽然我不喜欢“点击这个菜单,然后回到同一个菜单,因为现在它不同”的流程,但这似乎是将会发生的事情。 – ccombs

相关问题