自動化は怖くないッ!~Google Apps Script編②~

いちいちボタンをクリックする辛さよ

前回、Google App Scriptを利用して国民の祝日を取得するスクリプトを作りました。
ボタン一つで国民の祝日を取得できる、何てラクチンなんだ!
techblog.cartaholdings.co.jp
「ちょぉ~~~~~っと、待ったァ!!」

ここで私はストップをかけさせていただきます!!!
確かに祝日を一気に取得できるようになりましたが、そのためには…
①スプレッドシートのボタンをクリックする
②取得したい年を入力する(まあ入力しなくてもいいけど)
③OKボタンをクリックする
3回も手動で何かしてるじゃないすか!やだー!(床ゴロ)
どうせ毎年取らなくちゃいけないんだったら自動で取ってほしいよ!!
しかもできれば決まった日に実施して欲しい!!祝日取得は自動で今年と来年分が取れればいいんだよ!!

Google App Scriptの出番ですよ奥様!

おいおい前回Google App Scriptを使ったよ!と言うツッコミが来そうですね。
厳密にはGoogle App Scriptをあれこれ指定した日時に自動で動かしてくれる機能を使うことで、自動的に祝日を取得できるようになります。
差し当たっては自動で動かすために必要・不要なものがありますので、前回のスクリプトを参考にしつつ一部処理を追加・削減していきます。
どうぞお付き合いくださいませ。

と、言うわけで早速Googleスプレッドシートの上部メニューの「拡張機能」>「Apps Script」をクリックしましょう。Apps Scriptのページが表示されますので、右側のコード領域を全て選択して削除した後、後述のコードをコピー&ペーストしてください。

そのままキーボードの[Ctrl]キーと[S]キーを同時に押して保存してしまいましょう。

実行してみよう(App Scriptの画面から)

早速、保存したスクリプトを実行してみましょう。
実行する関数を「triggerExecute」に変更し、「▷実行」をクリックします。
実行ログ側に「お知らせ 実行終了」まで出たらスプレッドシート側に戻ってみます。

あっという間にスプレッドシートの「祝日一覧」シートに、日付が入力されましたね?よく見ると今年よりも前の祝日は非表示行になり、ついでに来年の祝日が入ってます。
これはすごい!(自画自賛)

前回と何が変わったの?

前回のスクリプトとの動きの違いは大まかに以下の通りです。
①ダイアログ表示をやめた
②自動で今年以降の祝日を取得するようにした
③今年よりも前の祝日行は非表示にした

①について
自動で動かしたいのにダイアログを表示してユーザからの入力待ちにする必要はありませんよね?
なので、ダイアログは全て表示しないようにしています。(対象年の指定をするダイアログと取得結果のダイアログ)
②について
①で対象年を入力しなくなったため、最新の祝日(今年以降)を自動的に取得するようにしました。
ちなみに、国立天文台が、毎年2月に翌年の「春分の日」、「秋分の日」を官報で公表しているとのことなので、2月1日以降に動くと翌年の祝日データが取得できます。
③について
祝日を一覧化するシートに対して手動メンテナンスをするタイミングが少なくなることを想定しており、その上でユーザーがシート内容を確認したときに、去年より前のデータを確認する状況がほとんどないと仮定し、今必要としていそうな情報をぱっと見られるように、必要な行以外を非表示にしています。
(行削除しないのは、大体は処理速度の都合です)
そんな親切大きなお世話だよという方は174~180行目を削除しましょう。

実行してみよう(App Scriptのトリガー画面から)

今でこそGoogle Apps Scriptのページから手動実行していますが、今回は自動で取ってほしいから新しくスクリプトを組んだんですよね?忘れていませんよ!!
自動でスクリプトを実行するには、トリガーという機能を使って実行する必要があります。
App Scriptのプロジェクトページを今開いていると思いますが、そちらの時計マークをクリックしてみましょう。

はて、何やら画面が表示されましたね?
これが、今まで作ったスクリプトを自動で動かしてくれる「トリガー」設定のページになります。
御託は不要、さっさと設定を教えて!!という声が出てきそうなので、早速右下の「+トリガーを追加」ボタンを押しましょう!
トリガーを追加するダイアログが表示されたと思います。その後、次の画像のように設定してみてください。

これは、さっきコピペしてもらったスクリプトの「triggerExecute」を「月1回」「毎月2日」の「午前0~1時」に実行する設定になります。
(本当は年一起動で十分なのにGoogleAppsScriptのトリガーに年単位のトリガーが無いから……)
2日起動にしている理由は、上述の通りであり2月2日には確実に祝日が確定しているはずなので1日ではなく2日に起動するように設定します。
そのまま「保存」ボタンを押しましょう。

トリガーの一覧画面に戻り、こんな感じに何か1行追加されたと思います。
ちなみに、エラーが無く動けば実際はこんな感じになります。

2日の起動まで待てないよ!という人は、さっきの設定画面で時間ベースのトリガーのタイプをもう少し短いスパンのもの(週ベースのタイマーや日付ベースのタイマー)にしてもよいと思います。沢山動いても重複した日付がとられるわけではありませんからね!
(逆に、時間ベースや分ベースの起動だと、日付取得自体はできますが、別シートで作業している間とかでも処理が動いてしまうので、「何かちょっと重くなったか?」と感じることがあるかもしれません)

ちなみに、タイムゾーンの設定によっては期待した日付時刻に起動していないこともあり得るので、その場合は設定ファイルの変更が必要です。
①左側の歯車アイコン(プロジェクトの設定)をクリック
②右側に表示された「appsscript.json」マニフェスト ファイルをエディタで表示するを選択
③左側の<>アイコン(エディタ)をクリック
④左側アイコンのすぐ隣にある「ファイル」領域から「appscript.json」をクリック
⑤右側に表示されたソースコードの「timeZone」の値を「"Asia/Tokyo"」に設定し、Ctrl+Sで保存

自動化万歳!!

ほら、月一回(または指定した間隔で)Googleスプレッドシートに現時点で国が設定している祝日が取れるようになりましたね!
ボタンを押す苦痛からも、対象年を入力する苦痛からも解き放たれて、その分色んな業務に時間を費やすことが可能になりました!ぱちぱちぱち!!
決められた情報を取得するのにマウスとキーボードを使うのって本当に面倒くさいですよね。
Let’s enjoy your automatic programming!!