【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)
(1,1)
つまり、A1セルを示している。そもそもgetActiveCell()
が動作しておらず、空の組にそれぞれ1を加えた値が返ってきて結果的に(1, 1)になっている、という挙動が確認される。
おそらく、上手くいってない方はおおかた上記のようなコードになっていると思うので、初めに示したgetActiveSheet()
でシート取得を行うことを試してみてください!