行全体を取得するには、1 から始まると仮定し、Range.getLastColumn()
メソッドを使用して行の右範囲を見つけます。(行がずらされている場合、これにより両端の空のセルが強調表示される場合があります。ただし、それを確認すると、関数の速度がさらに低下します。)
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var cell = ss.getActiveCell();
var range = sheet.getRange(cell.getRow(),1,1,sheet.getDataRange().getLastColumn());
var note = cell.getNote();
var user = Session.getUser();
note = user;
cell.setNote(note);
if(note = "user@email.com") {
range.setBackgroundRGB(255, 0, 0);
}
};
あなたは「より良い方法」についても尋ねました。これは、いくつかの「改善」を加えたバリエーションです。
コンテナにバインドされたスクリプトに依存するのではなく、トリガー イベントを使用します。(イベントについて を参照してください。) これにより移植性が高まりますが、情報が無料で渡されるため、スプレッドシート サービスへの (遅い) 呼び出しをなくすことができます。
この機能をテストするには、「GAS でトリガー機能をテストするにはどうすればよいですか?」で説明されている手法を使用します。.
元のスクリプトには、if-then
どのユーザーが変更を行ったかを確認するための が含まれていました。これは、ユーザーを追加するにつれて大きくなるコード ブロックの始まりです。これは、データ駆動型のアプローチを採用していconst userColors
ます。次に、in
比較によってユーザーが既知であるかどうかを確認し、それに基づいて行動できます。
スプレッドシートまたは他の場所でユーザーの色を管理することで、さらに改善できます。また、新しいユーザーを動的に学習して独自の色を割り当てることもできます。とにかく、これにより、関数のロジックを変更する必要なく、ユーザーと色の組み合わせを簡単に追加できます。
関数ではonEdit()
、パフォーマンスに非常に注意する必要があります。(この例は非常に短いので、実際には問題ではありませんが、それでも良い習慣です。) このバージョンには、それに対処するための変更がいくつかあります。まず、色を設定する必要があるかどうかを確認します。編集中のセルが同じユーザーによって最後に編集されたものである場合、他に何もする必要はありません。次に、Spreadsheet Services を呼び出す多くの操作が移動され、必要な場合にのみ実行されるようになりました。
更新されたスクリプト:
function onEdit(event) {
const userColors = {
'user1@email.com' : 'red',
'user2@email.com' : 'blue',
'user3@email.com' : '#ff00ff'
};
var note = event.range.getNote();
var user = new String(Session.getUser());
// update note and color if new editor
if (note != user) {
var sheet = event.range.getSheet();
var range = sheet.getRange(event.range.getRow(),1,1,sheet.getLastColumn());
event.range.setNote(user);
if (user in userColors) range.setBackground(userColors[user]);
// don't color unknown users
else range.setBackground('white');
}
};