【GAS】複数シート使用時のgetActiveCell()の挙動について

Google Apps Script(GAS)で最終変更時刻の自動記入機能を作成している際に、getActiveCell()の挙動が思うようにいかなかったので、解決時のメモ。

Twitterで何人か同様にハマっている方がいらっしゃったので、何かの役に立てれば幸いです。

getActiveCell()を使用した最終時刻更新

コード

function insertLastModified() {
  /**
   * @param - None
   * @retuen - None
   */
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var active_sheet = ss.getActiveSheet();
  var sheet4update = ss.getSheets()[2];  // 今回はシート3を対象とする

  if (active_sheet.getName() == sheet4update.getName()){
    var column_modified = findColumn(sheet4update, '最終更新時刻');

    /// 更新したセルを取得
    var active_cell = active_sheet.getActiveCell();

    /// 削除時は動作しないように。
    if (active_cell.getValue() != []){
      /// 更新した行を取得
      var active_row = active_cell.getRow();

      /// 更新時刻を記入
      sheet4update.getRange(active_row, column_modified+1).setValue(new Date());
    }
  }
}

function findColumn(sheet, keyword) {
  /**
   * @param {string} sheet - 列番号を取得したい項目のあるシート
   * @param {string} keyword - 取得したい項目名
   * @return {double?} target_column - keywordの列のインデックス
   */
  /// 最終列を取得
  var last_column = sheet.getLastColumn();
  var range = sheet.getRange(1, 1, 1, last_column);

  /// ヘッダー行をすべて(最終列まで)取得
  var headers = range.getValues();

  /// 特定の文字列のある列がどこかを検索して、列のインデックスを返す
  /// シートの列番号として処理したい場合は +1 することに注意。
  var target_column = headers[0].indexOf(keyword);

  return target_column;
}

ポイント

getActiveCell()を使う際のポイントは、シートの取得の際もgetActive〇〇()を使用する必要があるという点にある。

しかし、公式ドキュメントにはこれに言及されていないため、シートを明示的に指定するようなコードを書くと、正しいセルが取得できないという問題が生じる。

ちなみに、getActiveCell()よりも、getCurrentCell()が推奨されている。

ダメだったときのコードとその際の挙動

コード

var ss = SpreadsheetApp.openById('<YOUR_SPREADSHEET_ID>');
var sheet = ss.getSheets()[2];

var column_modified = findColumn(sheet, '最終更新時刻');

/// 更新したセルを取得
var active_cell = active_sheet.getActiveCell();
console.log(active_cell);

/// 更新した行を取得
var active_row = active_cell.getRow();
console.log(active_row);

/// 更新時刻を記入
sheet.getRange(active_row, column_modified+1).setValue(new Date());

挙動

{}
(1,1)

つまり、A1セルを示している。そもそもgetActiveCell()が動作しておらず、空の組にそれぞれ1を加えた値が返ってきて結果的に(1, 1)になっている、という挙動が確認される。

おそらく、上手くいってない方はおおかた上記のようなコードになっていると思うので、初めに示したgetActiveSheet()でシート取得を行うことを試してみてください!