Session.getActiveUserは()のonEditトリガーでづけしませんあなた自身と編集者としてオーナーを取り除くことはできないという事実で、したがって、保護された範囲からすべてのエディタを削除した場合は、自分自身をエディタ(および所有者)として割り当てています。
このスクリプトでは、スプレッドシートの所有者が誰もが邪魔する可能性があります。他の人はあなたが望むように動作します:彼らは自分のエントリと空のフィールドだけを編集することができます。
// Test it with colors
// var edittedBackgroundColor = "RED"; // makes the change visible, for test purposes
// var availableBackgroundColor = "LIGHTGREEN"; // makes the change visible, for test purposes
function onEdit(e) {
Logger.log(JSON.stringify(e));
var alphabet = "abcdefghijklmnopqrstuvwxyz".toUpperCase().split("");
var columnStart = e.range.columnStart;
var rowStart = e.range.rowStart;
var columnEnd = e.range.columnEnd;
var rowEnd = e.range.rowEnd;
var startA1Notation = alphabet[columnStart-1] + rowStart;
var endA1Notation = alphabet[columnEnd-1] + rowEnd;
var range = SpreadsheetApp.getActive().getRange(startA1Notation + ":" + endA1Notation);
if(range.getValue() === "") {
Logger.log("Cases in which the entry is empty.");
if(typeof availableBackgroundColor !== 'undefined' && availableBackgroundColor)
range.setBackground(availableBackgroundColor)
removeEmptyProtections();
return;
}
// Session.getActiveUser() is not accesible in the onEdit trigger
// The user's email address is not available in any context that allows a script to run without that user's authorization, like a simple onOpen(e) or onEdit(e) trigger
// Source: https://developers.google.com/apps-script/reference/base/session#getActiveUser()
var protection = range.protect().setDescription('Cell ' + startA1Notation + ' is protected');
if(typeof edittedBackgroundColor !== 'undefined' && edittedBackgroundColor)
range.setBackground(edittedBackgroundColor);
// Though neither the owner of the spreadsheet nor the current user can be removed
// The next line results in only the owner and current user being able to edit
protection.removeEditors(protection.getEditors());
Logger.log("These people can edit now: " + protection.getEditors());
// Doublecheck for empty protections (if for any reason this was missed before)
removeEmptyProtections();
}
function removeEmptyProtections() {
var ss = SpreadsheetApp.getActive();
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if(! protection.getRange().getValue()) {
Logger.log("Removes protection from empty field " + protection.getRange().getA1Notation());
protection.remove();
}
}
return;
}
function isEmptyObject(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return JSON.stringify(obj) === JSON.stringify({});
}
http://stackoverflow.com/questions/40322476/get-the-user-who-clicked-on-the-button-in-the-spreadsheetと同じコメント、\t あなたが使用している場合「通常の」Gmailアカウントでは、スプレッドシートにアクセスするときにユーザーの電子メールを取得することはできません。ビジネスや教育のバージョンでは、 –
@Sergeinsas yepすることができます。 – Wlad
あなたは実際にそれを行うことができます。私はこの非常にクールな回避策を見つけました、私のコメントを参照してください! :) –