Googleスプレッドシートでセルが編集されたときに別のセルに日時を挿入する方法
Google Apps Scriptを利用して割とよくある処理なのですが、あまり汎用化された例を見ないのでスクリプトを作ってみました。
汎用化したのは次の項目です。
ウェブリブログの仕様で、コードの右側が見切れてますが、きちんとコピーできます。
汎用化したのは次の項目です。
- 処理対象のシートを指定できる
- 処理対象の列を指定できる
- 処理対象の行を指定できる(行の範囲指定と、特定の行)
- 日時を挿入するセルの位置(相対指定)
- 1度しか日時を挿入しないか、常に日時を挿入するか
- セルの内容が削除されたときに、挿入するか挿入しないか
- セル範囲のコピー&貼り付けにも対応
ウェブリブログの仕様で、コードの右側が見切れてますが、きちんとコピーできます。
// セルが編集されたときに任意のセルに編集日時を挿入する(コピペなどのセル範囲の編集にも対応)
function setEditedDateTime(e) {
// 現在の日時を取得する
var now = new Date();
// 処理の対象となるシートを、シート名の配列で定義しておく
var targetSheets = ["シート2", "シート3" ];
// 処理の対象となる列を、列番号の配列で定義しておく
var targetCols = [ 3, 6 ];
// 処理対象となる行を制限する場合に範囲指定と行番号の指定で対応可能にする
var targetRowRange = false; // 行の範囲で処理するなら true にする
//var targetRowRange = true; // 行の範囲で処理するなら true にする
var targetRowMin = 10;
var targetRowMax = 15;
var targetRowArray = false; // 特定の行だけで処理するなら true にする
//var targetRowArray = true; // 特定の行だけで処理するなら true にする
var targetRows = [ 5, 7 ];
// 日時を挿入するセルの相対位置を指定する (このサンプルでは右隣に挿入する)
var offsetRow = 0;
var offsetCol = 1;
// 日時の挿入は1回だけかどうか定義する (trueなら1回しか挿入しない)
var updateOnce = true;
//var updateOnce = false;
// ブランクのセルは無視するかどうか定義する
var ignoreBlank = true;
//var ignoreBlank = false;
// 編集中のシートの取得
var editedSheet = e.range.getSheet();
// 編集したセルの Rangeを取得
var editedRange = e.range;
// 処理対象のシートか確認する
if (targetSheets.indexOf(editedSheet.getName()) >= 0) {
// 編集された行の範囲をチェックする
for (var row = editedRange.getRow() ; row < editedRange.getRow() + editedRange.getNumRows() ; row++ ) {
// 処理対象の行か判断する
if (targetRowRange && (row < targetRowMin || row > targetRowMax)) {
continue;
}
if (targetRowArray && targetRows.indexOf(row) == -1) {
continue;
}
// 編集された列の範囲をチェックする
for (var col = editedRange.getColumn() ; col < editedRange.getColumn() + editedRange.getNumColumns() ; col++) {
// 処理対象の列か判断する
if (targetCols.indexOf(col) >= 0) {
// 日時を挿入する
var rangeDatetime = editedSheet.getRange(row + offsetRow, col + offsetCol, 1, 1);
if (updateOnce && rangeDatetime.getValue() != "") {
continue;
}
if (ignoreBlank && editedSheet.getRange(row, col, 1, 1).getValue() == "") {
continue;
}
rangeDatetime.setValue(now);
}
}
}
}
}
// onEditを定義するとセルが編集されたときに自動的にこの関数(onEdit)が呼び出される
//
// 引数 e で編集されたセルの情報が渡される
// "edit | Event Objects | Apps Script | Google Developers"
// https://developers.google.com/apps-script/guides/triggers/events#edit
//
function onEdit(e) {
// 日時の挿入処理を呼び出す
setEditedDateTime(e);
}
この記事へのコメント
こちらのスプリクトを使わさせていただいております。いつもお世話になっております。
こちら今まで問題なく使えていたのですが、一ヶ月ほど前から日付がうまく反映されなくなってしまいました。
以下のスプリクトでエラーが表示されております。
《指摘されたスプリクト》
// 編集中のシートの取得
var editedSheet = e.range.getSheet();
《指摘されたエラー》
TypeError: Cannot read property 'range' of undefined
何か解決策はございますでしょうか?
ぜひお力添えをよろしくお願い致します!
試してみましたが、手元のコードでは正常に動作していますよ。
Cannot read property 'range' of undefined とのことですので、e が undefined になっているのでしょう。
まずは onEditトリガーで呼び出される関数で e の中身をチェックしてみてください。