GAS:通过自定义UI菜单进行脚本授权失败,并显示“您无权执行该操作。”

时间:2018-10-15 17:43:49

标签: menu authorization cross-domain gas

我有一个带有绑定脚本的电子表格,该脚本试图标识当前正在对该工作表进行编辑的用户,并将编辑信息附加到工作表的指定列中。

似乎用户总是必须通过打开脚本编辑器并通过“播放”按钮手动运行功能来接受初始脚本授权(该Google弹出窗口要求许可)。通过自定义UI菜单调用该功能无效,并引发错误:“您无权执行该操作。请让此项目的所有者授予您访问权限。”

有什么方法可以以更加用户友好的方式来调用授权,而无需用户打开脚本编辑器?

我认为制作菜单就是重点(手动执行与onEdit()或onOpened()触发的执行),但是就目前而言,这种解决方法没有用-如果用户有菜单,我就不需要菜单打开编辑器以实现相同的目的。

完整代码:

function onEdit(e) {      
  var sheet = e.source.getActiveSheet();
  var labels = e.source.getRangeByName("labels");

  if (labels == null) {
    Logger.log("Error: couldn't find named range 'labels'!");
    return; 
  }

  var found = false; 

  for(var i = 1; i <= labels.getNumColumns(); i++){
    if (labels.getCell(1,i).getValue() == "last edit") { 
      found = true;
      break; 
    }
  }

  if (!found) {
    Logger.log("Error: couldn't find column 'last edit'!");
    return; 
  }  

  var minrow = labels.getRowIndex();
  var range = sheet.getActiveRange();
  var row = range.getRowIndex();

  // don't track edits above the labels
  if (row <= minrow) { return; }

  var range_depth = range.getNumRows();  
  var rangeA1 = range.getA1Notation();  
  var timestamp = Utilities.formatDate(new Date(), "GMT+2", "YYYY-MM-dd HH:mm");

  // the elegant way - requires the sheet owner and users to be on the same domain:
  // var user = Session.getActiveUser().getEmail();

  // the workaround - requires the user to identify themselves manually:
  var user = PropertiesService.getUserProperties().getProperty("ID");
  if (user == null) {
    Browser.msgBox('Current user unidentified. Run the identification script via the "Edit tracking" menu (next to "Help").');
    user = 'unknown';
  } 

  for (var j = 0; j < range_depth; j++) {
    sheet.getRange(row+j, i).setValue(timestamp);
    sheet.getRange(row+j, i+1).setValue(user);
    sheet.getRange(row+j, i+2).setValue(rangeA1); 
  }

  SpreadsheetApp.flush();
}


function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('Edit tracking')
      .addItem('Identify current user', 'showIdentify')
      .addItem('Forget current user', 'showForget')  
      .addToUi(); 
}

function showIdentify() {
  var ui = SpreadsheetApp.getUi();

  var result = ui.prompt(
      'Edit tracking',
      'Please enter your name:',
      ui.ButtonSet.OK_CANCEL);

  var button = result.getSelectedButton();
  var text = result.getResponseText();

  if (button == ui.Button.OK) {
     PropertiesService.getUserProperties().setProperty("ID", text);
  } else {
    ui.alert('Look, you\'re not dodging this, I\'ll nag you again on the next edit.');
  } 
}

function showForget() {
  var ui = SpreadsheetApp.getUi();
  PropertiesService.getUserProperties().deleteProperty("ID");  
  ui.alert('You\'re anonymous now.');
}

1 个答案:

答案 0 :(得分:0)

在我看来,这就像是Google工作表中的错误,该脚本未与工作表一起共享。

但是要使其更加用户友好

A)公开共享您的工作表(互联网上的任何人都可以查找和编辑)或

B)(使用“具有链接的任何人都可以编辑”共享)在脚本编辑器中,获取共享链接File-> Share ...,然后让用户打开该链接。

然后它将起作用。