发布附加组件的授权生命周期无效

时间:2014-12-02 13:42:06

标签: google-apps-script google-sheets google-docs google-docs-api google-drive-api

我的插件存在问题,但是在商店安装之前,不会在Google表格和文档的附加组件中创建菜单项,直到刷新页面为止。

根据Google支持,我应该查看以下内容:

“通常这是由授权生命周期的问题引起的,特别是在开放阶段。

最常见的罪魁祸首是代码中的一个全局变量,它试图在未经授权的情况下访问Google服务,例如:

var doc = DocumentApp.getActiveDocument();

参见文档:

警告:当您的onOpen(e)函数运行时,将加载整个脚本并执行任何全局语句。这些语句在与onOpen(e)相同的授权模式下执行,如果模式禁止它们将失败。这可以防止打开(e)。如果您发布的加载项无法添加其菜单项,请在浏览器的JavaScript控制台中查看是否抛出错误,然后检查您的脚本以查看onOpen(e)函数或全局变量是否调用不允许的服务在AuthMode.NONE中。“

我不知道我应该如何处理这个问题,因为我的附加组件并非由我创建。我可以做一些小事,但这是我自己无法处理的事情,请真的需要你的帮助。

听到我的剧本:

function onOpen(e) {
    SpreadsheetApp.getUi().createAddonMenu()
      .addItem('Browse Templates', 'browseTemplates')
      .addToUi();
}

function onInstall(e) {
  onOpen(e);
}

function browseTemplates(){
    collectBasicData();
   // Display a modal dialog box with custom HtmlService content.
   var htmlOutput = HtmlService
   .createTemplateFromFile("Gallery").evaluate()
   .setWidth(700)
   .setHeight(510);
   SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Spreadsheet123 - Template Vault');
}

function collectAllData(){
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(DATA_SHEET);
  DATA = sheet.getDataRange().getValues();
  return DATA;
}

function collectBasicData(){
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(PIVOT_SHEET);
  var tabSheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(TAB_SHEET);
  BASIC_DATA = {
    "tab_about" : getValue(tabSheet,"B1"),
    "tab_help": getValue(tabSheet,"B2"),
    "pivot":sheet.getDataRange().getValues()
  };
  return false;
}

function getValue(sheet,addr){
  return sheet.getRange(addr).getValue().toString().replace(/^\s+|\s+$/g, '');
}

function createACopy(id){
  var docName = DocsList.getFileById(id).getName();
  return DocsList.getFileById(id).makeCopy(docName).getUrl();
}

function insertInCurrent(id){
    var destinationSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
    var sourceSheets = SpreadsheetApp.openById(id).getSheets();
    for(var i=0;i<sourceSheets.length;i++){
        var sheetName = sourceSheets[i].getName();
        var source = SpreadsheetApp.openById(id).getSheetByName(sheetName);
        source.copyTo(destinationSpreadSheet).setName(sheetName);
    }
}

我查看了Google上的文档,但无法理解我应该在脚本中使用它的方式和位置。

非常感谢您的帮助,并提前致谢

0 个答案:

没有答案