如果,如您在评论中所述,您在编辑触发器上使用可安装的,则您描述的问题不应该发生,因为“当脚本由于触发器而运行时,脚本使用安装触发器的人的身份运行,而不是身份操作触发事件的用户。这是出于安全原因。例如,如果您在脚本中安装了触发器,但您的同事执行了触发事件的操作,则脚本以您的身份运行,而不是您同事的身份。有关这方面的完整信息,请参阅了解权限和脚本执行。”
在这里查看文档
编辑:抱歉,我没有看到关于这个特殊情况的问题:问题 1562 于 2012 年 7 月发布,状态为“已分类”
编辑 2:我尝试了 @tracon6 建议暂时删除保护,但它也不起作用......脚本在尝试应用保护时生成错误。
但
作为编辑 3
我找到了一个可行的解决方法!我们可以在写入 targetSheet 时添加一个编辑器,然后在之后立即删除它……flush
在它之间使用一个 in 可以工作。
这是我用来测试的代码:
function onEditInstallable(event) {
var sheet = event.source.getActiveSheet();
if(sheet.getName()=='Sheet1'){return};
var r = event.source.getActiveRange();
var column = r.getColumn();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = ss.getSheetByName("TFA");
var targetSheet = ss.getSheetByName("Sheet1");
var user = SpreadsheetApp.getActive().getEditors()[1];
var permission = targetSheet.getSheetProtection();
permission.addUser(user);
targetSheet.setSheetProtection(permission);
SpreadsheetApp.flush();
targetSheet.getRange(1,column).setValue('value change on sheet 2, column : '+column);
SpreadsheetApp.flush();
permission.removeUser(user)
targetSheet.setSheetProtection(permission)
}
编辑 4:
由于似乎许多编辑者都可以访问这些表格(请参阅最后的评论),因此必须有一种方法可以知道谁在电子表格上处于活动状态。在非域环境中,使用触发函数是不可能的,因此我建议使用带有列表的小型 uiApp,用户必须从中选择,使用可安装的 onOpen 触发它,并将值存储在主函数中使用它。
Heres 是处理该方面的一段代码。
function SpecialonOpen(){
var s = SpreadsheetApp.getActive();
var app = UiApp.createApplication().setTitle('Please select your email in this list').setWidth(300).setHeight(300);
var list = app.createListBox().setName('list')
var editors = s.getEditors();
for(var n in editors){
list.addItem(editors[n].getEmail());
}
var handler = app.createServerHandler('getMail').addCallbackElement(list);
var btn = app.createButton('select',handler);
s.show(app.add(list).add(btn))
}
function getMail(e){
var email = e.parameter.list;
var editors = ScriptProperties.getProperty('currentEditors')||' ';
if(editors.indexOf(email)==-1){
editors+=(','+email);
ScriptProperties.setProperty('currentEditors',editors);
}
var app = UiApp.getActiveApplication().close();
var editors = ScriptProperties.getProperty('currentEditors').split(',');
if(editors[0].length<2){editors.splice(0,1)};
Logger.log(editors)
return app
}
您还应该添加一个功能来在某个时刻重置此列表......不知道什么是最好的?也许每天都有?我会让这个给你;-)