我的用例是我将有一个电子表格中定义的流程规则列表 . 那是后端的东西 . 最终用户将复制一个Google文档,该文档将根据规则电子表格的内容提供动态菜单 . 我写了一个onOpen函数,它从电子表格中读取并创建为工作表命名的菜单项 . 这些菜单项将触发一个处理工作表中的规则的函数 .
我的问题是onOpen函数在从脚本编辑器触发时正确运行,但在打开文档时不会触发 . 通过玩弄评论位,我已经确定SpreadsheetApp.openById()命令导致onOpen函数在初始doc加载时失败 . 它将在不使用该命令时运行 .
我已经在函数内部和外部设置了工作表定义,并且结果没有区别,因此我认为下面的代码应该是假设的 . 确实如此,只是在文档打开时不会自动执行 . 有意思吧?所以这是我的代码文档:
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);
}
1 回答
您无法从
onOpen
触发的函数访问外部文件(电子表格或其他内容) . 由于此功能自动运行,无需任何用户授权 . 它无法访问可能需要授权的API .我不知道有任何解决方法,我想你只需改变你的方式 . 也许从用户单击您从
onOpen
创建的固定菜单的功能设置此动态菜单 . 因为当用户点击某个功能时,会向他显示授权弹出窗口,然后您的脚本可以在他的权限下运行,并且可以执行他授权的所有操作,这意味着要打开此电子表格,必须与他共享,只有你有其他用户才有意义:)