FUKULOG

FUKULOG開発者ブログ

FUKULOGの新人エンジニアがサイトの開発や運営について書いています。

Google Apps Script を使って各種有効期限を管理&メールでお知らせするようにすると便利

Posted by @wata_n

GAS(Google Apps Script)を使って、ドメインやSSL証明書などの有効期限を管理&メールでお知らせするようにしたら便利だった件。

更新が必要系サービスで、有効期限直前に慌てて更新手続きすることってありますよね。 ドメインだったり、Apple Developers Program だったり、iOSアプリに必要な証明書だったり。

それらをちゃんと管理しようと思って、最初はGoogleカレンダーでいいじゃん、って思ったんですが、 1画面で利用サービスを一覧出来る感じも欲しいなぁ…と。リマインドしてくれるだけならGoogleカレンダーで十分なんですけどね。

というわけでGAS!便利です!GASって言っても、JavaScriptだし!

有効期限管理表をGoogleスプレッドシートで作る

まずは、こんな表をGoogleスプレッドシートで作ります。

もちろんカラムやカラム名などご自由に。

スクリプトを書く

ここから実際にスクリプトを書いていきます。 上で作ったスプレッドシートの画面で、[ツール]→[スクリプト エディタ]を開きます。 別画面でエディタ画面が立ち上がると思うので、カラム名やメールなどを埋めつつ、下のようなスクリプトを書いていきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function sendMailExpiredServices(){
  /*
   * Config
   */
  // カラム名
  var SERVICE_COL_NAME = 'サービス';
  var LIMIT_COL_NAME   = '期限';
  var ADMIN_COL_NAME   = '管理者';
  var COMMENT_COL_NAME = 'コメント';

  // メール
  var admin = 'nagasawa@example.com'; // 管理者(必須)
  var to    = 'nagasawa@example.com, foo@example.com, bar@example.com';
  var opts  = {
    //cc   : '',
    bcc  : admin,
    reply: admin
  };

  // 何日前に送信するか
  var grace_time = 1000 * 60 * 60 * 24 * 7;

  /*
   * Main
   */
  try {
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getDataRange();
    var today = new Date();

    for (var i = 2; i <= sheet.getLastRow(); i++) {
      var subject = "【期限切れ】";
      var body = "の期限が迫っています。\n\n"
      + "------------------------------------------------------------\n";
      var footer = "------------------------------------------------------------\n\n"
      + "更新の手続きをお願いします。\n\n"
      + "※更新後はシートの【期限】も更新してください\n"
      + "<Googleスプレッドシートの共有リンク>\n";
      var flg = false;

      for (var j = 1; j <= sheet.getLastColumn(); j++) {
        var col_name  = range.getCell(1, j).getValue(); // カラム名
        var col_value = range.getCell(i, j).getValue(); // 入力値

        body += "【" + col_name + "】\n";
        body += col_value + "\n\n";

        if ( col_name === SERVICE_COL_NAME ) {
          subject += col_value;
          body = col_value + "\n\n" + body;
        }
        if ( col_name === LIMIT_COL_NAME ) {
          var diff = col_value - today;
          if (diff < grace_time) {
            range.getCell(i, j).setBackgroundColor('#fAA');
            flg = true;
          }
        }
      }
      body += footer;

      if (flg) {
        MailApp.sendEmail(to, subject, body, opts);
      }
    }
  } catch(e) {
    MailApp.sendEmail(admin, "【失敗】有効期限管理表からメール送信中にエラーが発生", e.message);
  }
}

スクリプトを保存(フロッピーボタン)して、試しに実行(再生ボタンみたいなやつ)すると、 スプレッドシートの方で、期限が近づいてるセルが赤くなったと思います。

届いたメール

そして実際に届くメールがこんな感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Subject: 【期限切れ】iOS Development

iOS Development

の期限が迫っています。

------------------------------------------------------
【サービス】
iOS Development

【期限】
Tue Aug 20 2013 00:00:00 GMT+0900 (JST)

【管理者】
nagasawa

【コメント】
開発用プロビジョニングファイル

------------------------------------------------------

更新の手続きをお願いします。

※更新後はシートの【期限】も更新してください
https://docs.google.com/...

あとは、スクリプトエディタ画面中、[リソース]→[現在のプロジェクトのトリガー…]を開いて、 スクリプトを実行するトリガーとなるイベントの設定をしときます。

[sendMailExpiredServices] [時間主導型] [日タイマー] [午前9時〜10時]

みたいな感じに。

あとは管理したいサービスが増えてもこのシートにどんどん追加していけばおk!

これでもう有効期限直前に慌てるなんてこともないはず! (あとは人間の問題。。)