【改訂版】Google Apps Scriptを使いSpreadsheetsでカンタンに更新日時と起票日を自動入力する方法

以前に投稿した「【旧版】Google Apps Scriptを使いSpreadsheetsでカンタンに更新日時と起票日を自動入力する方法」

【旧版】Google Apps Scriptを使いSpreadsheetsでカンタンに更新日時と起票日を自動入力する方法

の改訂版です。以前作ったものからの改善点は、以前は「起票日」「更新日」といった項目のセル番号(「A1」)で指定しなければならなかったのを、「起票日」「更新日」というタイトルが入っていれば無条件で自動記入するようにしました。

2018/10/15追記:とりすけさんにコメントいただいたので、「更新日のアップデート対象となる編集列を指定する」機能を追加しました。

コードは以下参照。

function insertLastUpdated3() {
  var sheet = SpreadsheetApp.getActiveSheet(); //現在触っているシートを取得
  var data = sheet.getDataRange().getValues();//シート全体のデータを取得する場合  // dataにはシートのデータが2次元配列で入る
  var checkTitles = []; // 取得した項目タイトル(1次元配列)を保存する引数
  var checkRowIndex = 0; // ★項目タイトルを保持する行のインデックス。行数からマイナス1した数をいれる。1行目にあるならこのままでOK
  var updateTitle = '更新日'; // ★更新日を記述する列のタイトル名
  var startTitle = '起票日'; // ★起票日を記述する列のタイトル名
  var startCol; // 起票日の列番号を格納する引数
  var updateCol; // 更新日の列番号を格納する引数
  // var allowedUpdateCol = 'all'; // 
  var allowedUpdateCol = [1,2,3,4,5]; // ★★ []内にカンマ区切りで列数を入力することで、指定列のセルが更新された場合のみに、その行の更新日が自動更新される。
                                      // すべての列を対象としたい場合は var allowedUpdateCol ='all'; とする。
  /**********  **********/
  for (var i = 0; i < data.length; i++) {
    if(i == checkRowIndex) {
      checkTitles = data[i];
    }
  }

  // 起票日・更新日を記入するカラム番号を取得
  for (var j = 0; j < checkTitles.length; j++) {
    // 起票日の列番号を定義
    if (checkTitles[j] === startTitle) {
      var startCol = j+1;
    }
    // 更新日の列番号を定義
    if (checkTitles[j] === updateTitle) {
      var updateCol = j+1;
    }
  }
  
  var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得
  var currentCol = sheet.getActiveCell().getCol(); //アクティブなセルの列番号を取得
  var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得
  var startRange = sheet.getRange(currentRow, startCol); // 起票日を記入するセルのレンジ
  var updateRange = sheet.getRange(currentRow, updateCol); // 更新日を記入するセルのレンジ
  var updateData = updateRange.getValue(); // 起票日にもともとデータがあるか確認

  //更新日の記入 
  if(allowedUpdateCol == 'all' || allowedUpdateCol.indexOf(currentCol) !== -1) { // どの列を更新しても更新日を更新させる場合 or 指定列のみ更新させる
    if(allowedCol = -1) { // どの列を更新しても更新日を更新させる場合
      if(updateCol > 0) { // タイトル行に「更新日」という項目がある場合
        if(currentRow > checkRowIndex+1){ // 自動編集の範囲から固定行を除くための処理
          if(currentCell) { //もし触っているセルが空でなかったら
            updateRange.setValue(new Date());
          }
        }
      }
    }
  }
  //起票日の記入
  if(startCol > 0) { // タイトル行に「起票日」という項目がある場合
    if(!updateData) { // 起票日は一度入力したら、以降更新なし
      if(currentRow > checkRowIndex+1){ // 自動編集の範囲から固定行を除くための処理
        if(currentCell) { //もし触っているセルが空でなかったら
          startRange.setValue(new Date());
        }
      }
    }
  }
}

//更新日時を自動設定したいスプレッドシートにプロジェクトを作成。
//トリガーを 「イベント」/「編集時」 で設定。

Spreadsheets用のContainer Boundスクリプトです。
”★”が付いている項目を変更することで、トリガーとなるタイトル名やタイトルの行数を変更できます。
例えば「更新日」を「更新日時」に変えたり、「起票日」を「開始日」等に変更できます。

2018/10/15追記: ”★★”が付いている項目を変更することで、更新日を更新させる列を修正できます。
 例えば allowedUpdateCol = ‘all’; とすればこれまで通りすべての列を更新日アップデートの対象にできますし、  allowedUpdateCol = [3,8,11]; とすれば、3列目、8列目、11列目の値が変更された場合のみ、更新日がアップデートされます。


プログラムは独学なのでもっと良い書き方がありましたらご指摘下さい。
誰かのお役に立ちますように。

コメント

タイトルとURLをコピーしました