2022/04/29に更新

【GASで自動化】日付が古い行をまとめて消す

スプレッドシート

シートにあるN日以前の行を自動的に削除するGoogle Apps Scriptです。シートにログを出力していると肥大化しがちなので作りました。

こんな悩みを解決します


  • スプレッドシートにログを出力しているが、定期的に削除するのが面倒。
  • シートで案件管理しているが、古い案件は自動的に消したい。

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

このスクリプトで出来ること


  • 日時型の列があれば、指定日数より前の行を削除することができます。
  • 手動でもトリガーでも実行可能です。

使い方


1.事前準備

スクリプトの「事前設定エリア」を編集します。下記項目をご自身の環境にあわせて書き換えてください。

  • スプレッドシートのURL
  • ログが書き込まれているシート名
  • どの列に日時が入っているか
  • ログは何行目から入っているか
  • 何日分のログを残したいか(7と入れた場合は本日より8日以上前のログが消去されます)

書き換えて保存したら、関数「onOpen」を一度実行して権限の承認をしてください。

2.動作確認

A列に日時を入れたサンプルファイルを用意しました。
7日分のログを残す設定で、この記事を書いているのは4/29なので・・・4/22以降のログだけ残るはずです。

実際はトリガーで実行しますが、確認のため手動で実行してみます。
上のメニューにある「スクリプト実行」から「N日以上前の行を削除する」を実行します。

想定通り4/22のログが一番上に来ました。問題なさそうです。

3.トリガーの設定

手動で実行してもよいのですが、トリガーで定期的に実行してしまいましょう。
不要な行の削除なので、デイリーで夜間に実行すればよいと思います。

  • 実行する関数: delete_old_records
  • 実行するデプロイ: HEAD
  • イベントのソース: 時間主導型
  • 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  • 時刻をを選択: 午前0時〜1時

4.注意点

このスクリプトは日時が昇順(下のほうが日付が新しい)で並んでいることが前提です。内部では日付(YYYYMMDD)に変換してから判定しているので日をまたがない程度に前後するのは問題ないはずです。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00075/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('N日以上前の行を削除する', 'delete_old_records');

  // メニューを画面に追加する
  menu.addToUi();
}


function delete_old_records() {

  //////////////// 事前設定エリア ここから /////////////////

  // 対象のスプレッドシートを指定
  const ss_url = 'https://docs.google.com/spreadsheets/d/*********************';

  // ログが書き込まれているシート名を指定
  const sheet_name = 'ログ';

  // 日時がどの列に入っているかを指定(A列なら1)
  const date_column = 1;

  // ログが何行目から書き込まれているかを指定(2行目から書き込まれていれば2)
  const offset = 2;

  // 何日分のログを残したいかを指定
  const need_days = 7;

  //////////////// 事前設定エリア ここまで /////////////////

  // スプレッドシートを開く。トリガーで動作させたいのでID or URLで開く
  const ss = SpreadsheetApp.openByUrl(ss_url);

  // ログが書き込まれているシートを開く
  const sheet = ss.getSheetByName(sheet_name);

  // ログをすべて取得する
  const values = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();

  // need_daysより前のログは不要なので、その日付を設定する
  let date_ago = new Date();
  date_ago.setDate(date_ago.getDate() - need_days);
  date_ago = Utilities.formatDate(date_ago, 'JST', 'yyyyMMdd'); //比較に使用するためYYYYMMDD形式にする

  // 最終的に何行消すのかを格納する変数
  let delete_rows_counter = 0;

  // ログを1行ずつチェックする
  for (let i = offset - 1; i < values.length; i++) { //オフセットで指定された行(0スタートなので-1)は飛ばす

    // 比較するためにyyyyMMdd形式に揃える
    let date_log = Utilities.formatDate(new Date(values[i][date_column - 1]), 'JST', 'yyyyMMdd'); //ログの日付

    // N日前より以前のログであれば、カウンタを加算する
    if (date_log < date_ago) {
      delete_rows_counter++;
    }

  }

  // カウンタが1以上であれば、行の削除を実行する
  if (delete_rows_counter > 0) {
    sheet.deleteRows(offset, delete_rows_counter);
  }

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

myfunc.jp