1

クライアントの連絡先情報を含む Google スプレッドシートがあります。

ユーザーが編集したことを示すために行の色を変更しなくても、ユーザーが自動的に行った編集を強調表示する方法を見つけようとしています。

私が考えていたのは、ユーザーがセルを編集するときに、そのセルにユーザーの電子メール アドレスを含むメモを追加することです。次に、そのセルに追加されたメモが特定の電子メール アドレスと等しいかどうかをチェックして、行の背景色を指定した色に設定します。

以下は、編集したセルにユーザーの電子メール アドレスのメモを追加し、編集したセルの背景色を赤に設定しますが、行全体には設定しません。

これを行う方法と、私がやろうとしていることを達成するためのより良い方法があるかどうかについてのアイデア。

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var cell = ss.getActiveCell();
  var range = ss.getActiveRange();
  var note = cell.getNote();
  var user = Session.getUser();

  note = user;
  cell.setNote(note);



  if(note = "user@email.com") {
    range.setBackgroundRGB(255, 0, 0);
  }

};
4

2 に答える 2

3

行全体を取得するには、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');
  }
};
于 2013-06-27T12:58:32.427 に答える