年間計画表づくりはけっこうめんどう
年間計画表、つくることありますか?めんどうですよね。
ふだん、予定はGoogle Calendarで作ってるから、必要な人はそのページを見てくれればいい。URLを共有しましょう。
「いや、紙でほしい」
あー、しょうがないですね。
でも、年間計画表を作るのはわりと難しいですよね。
今回のスクリプトはそんな人に向けて、Google Calendarのデータを使って、年間計画表を自動で作成する。 だいたいこんなのを作ることができる。
開発の経緯
年間計画表のスクリプトが非常に楽に年間計画表を作成できることはわかってもらえたと思う。
ふだん、どんなふうに年間計画表を作っているだろうか。何らかのファイルに年間のカレンダーを作って、そこに一つずつイベントを拾い上げていく作業をするのではないか。でも、年間のカレンダーは月の日数が月ごとに違っていたり、週末があったりするので、カレンダーを作ること自体がそれなりに手間がかかる。
そもそも、年間計画表を作成するのは普通は年に一回だ。場合によっては半期ごとに作成する。そうすると、作成のたびに以前作成した方法を忘れてしまって、また新たにファイルを作成するところからやり直しがちだ。文書に残してマニュアル化しようか?と思いつつ、そのうちに・・・と思ううちにまた一年が経つ。僕はそんな繰り返しを毎年してきた。
こんな仕事は人間がやることではない!と、ぶつぶつ言いながら、毎年カレンダーをちまちまと作るのだが、なんだか納得できない。
そこで、僕は Google Apps Script、いわゆるGASを使って計画表を作るスクリプトを作成した。自分の Googleカレンダーのデータで年間計画表を作成できる。
まず、アプリのサイトにアクセスすると、いろいろと権限を求められる。アプリがあなたのGoogle Calendarにアクセスできるようにするものなので、これは承諾してもらわないと、先に進めない。とはいえ、年間計画表はしょっちゅう作成するものでもないので、作成が終わったら、権限は削除しておこう。Googleアカウントの設定→セキュリティから削除できる。
アクセスを許可したら、自分が登録してるカレンダーが出てくる。
カレンダーから今回作成したいカレンダーを選び作成ボタンを押す。これで Google SpreadsheetにMyYearlyCalendarというファイルが作成されて、年間計画表が出力される。なお、今は作成できるカレンダーは一つだけだ。現状、作成後のメッセージ等は作っていないのでなにかのエラーが出るが、気にしないでほしい。そのうち、気分のあがるような完了メッセージでも考える。 設定画面で除外したいキーワードを入れておくと、計画表に載せたくないキーワードを含んだ情報を削除した年間計画表を作成する。普段から一貫したルールでGoogle Calendarに予定を入れておくと便利だ。例えば学校がある日は全部「学校」と入れてしまっていても、それを除外するようにすれば、年間計画表がそのイベント名で埋め尽くされることがなくなる。
開発の経緯
年間計画表のスクリプトが非常に楽に年間計画表を作成できることはわかってもらえたと思う。
僕も思いついたときは「これがあればどれだけ楽ができるか!」と、ちょっと夢想にふけった。
世の中に類似のものがないのかと探してみたのだが、僕の要望に合致するものはないみたいだった。見つけられたのは、Google SpreadsheetやExcelに入れたスケジュールをGoogle Calendarに登録するという逆のものだった。なんでそんなことをしたくなるのかわからないんだけどね。
年間計画表は年に一回がんばれば作れてしまう。その苦労は、スクリプトを開発する労力よりは小さそうだ。そうなると、わざわざ作るよりは「今年は」手作業で乗り切ろう、と毎年考えてしまいがちだ。僕もちょっぴりそう思った。でも自動化の便利さを味わいたいという気持ちは強かったので、自分で作ることにした。なにより、そのほうが微調整もできるので、結局は楽そうだった。
当初は自分のSpreadsheetにマクロを追加するイメージで作成を始めていた。そのときはそれでよいと思っていたけれど、作成過程で欲が出てきた。そもそも配布がめんどうだ。せっかくだから、Webアプリ化した方が喜ばれそうだ。
そこで、スケジュールをGoogle Calendar で管理していさえすれば、誰でも利用できるようにWebアプリ化することにした。みんなは便利だろうし、自分のスキルアップにもなる。GASでWebアプリを作ったことがなかったのでちょうどよい機会だった。
さて、僕はプログラムを書くときは、まずフローチャート的なものを作成することにしている。かっちりしたものではないけれど、いちおうプログラムの流れや使用するライブラリ、変数、関数がわかるようなものを作る。
実は、この年間計画表に関しては、そういうものが残っていない。理由は2つある。すごく単純なスクリプトだと思ったからというのが理由の一つで、もう一つの理由が、GoogleAppsScript(以下、GAS)で開発するのが事実上はじめてだったということがある。
単純なスクリプトは書く場合は、まず最初に大まかな処理内容をコメントで書くことで流れを決める。そこに処理を一つずつはめていくことで完成に結びつける。今回はその方法で作成した。
GASでなにができるのか?ということで言えば、当初はもっと簡単にGoogleCalendarからデータを引っ張ってきてそれをSpreadsheetに入れることができるのかと思っていた。勝手に期待していただけなんだけど、すごいことをやってくれるようなイメージだった。しかし、GASは単なるJavascriptの亜種に過ぎなくて、結局はかなりの作業が必要になった。
最初のメモはこんな感じだ。夢?なのか妄想なのか、簡単すぎるぐらい簡単だ。まあ、とりえずこの構想?をじょじょに拡張して、完成にいたった。
・作成するカレンダーを指定する ・作成する期間を設定する ・カレンダーを作りながら、該当日付のイベントを取得して、カレンダーに書き込む
開発ログ
GASでWebアプリを開発しようと思うといろいろわからないことが出てくるので、記録を共有しておく。
スプレッドシートの拡張機能の活用
最初に取り組んだのが、スプレッドシートの拡張機能だ。
大まかに分けると、計画作成用のシートに、年間のカレンダーを書く処理とそこに予定を記入する処理の2つだ。 当初はカレンダーを書きながら予定を記入していくことを考えていた。けれども、同じ日に複数の予定の処理でけっこうややこしくなりそうだった。また、将来的に、複数のGoogle Calendarからの予定を統合することも考えると、2つの処理を分けるほうが好都合なことがわかった。
この段階では、使用するカレンダーや予定表を作成する期間はスクリプトの中に記入するようにしている。
たぶん、GASに慣れている人ならこういう処理を書くのもすぐなんだろう。
ここまででプログラムはこんな感じになる。
function main(){ mycal = カレンダーIDを取得 monthFrom = 開始月 monthTo = 終了月 mysheet = 新しいシートを作成 makeCalendar(mycal, mysheet, monthFrom, MonthTo) insertEvents(mycal, mysheet, monthFrom, MonthTo) }
もちろん、makeCalendarとinsertEventsはこれから実装する。
Webアプリ化
スプレッドシートの拡張機能で実装することの弱点は、他の人が年間計画表を作成したいと考えたときに、自分でスプレッドシートを作成して拡張機能を入力する必要があることだ。
拡張機能(Apps Script)を使ったことがない人にとってこれはちょっとめんどうだ。 できれば、Webサイトにアクセスすれば勝手に年間計画表を作成してくれるのがいちばんいい。
幸いGoogle Apps Scripts(GAS)は、Webアプリを作成することも簡単だ。
まず、DoGet()という関数を用意して、こちらで最初のページを構築する。
次に、そのページからJavaScriptかフォームのPostを利用して指示をシステムに送る。
フォームのPostのばあい、指示はDoPost()という関数が受け取る。そして、いろいろ処理する。
簡単に見えるけど、エラーやデバッグ情報、途中経過を表示する方法がわからなくて、うまく動かない理由がわからなくて詰まってしまった。 Webアプリのデバッグはほんとうによくわからない。
代替手段として、Postで送られてきたものをそのままGoogle Spreadsheetに保存する方法が紹介されているので、こちらを採用。
例えばこことかかな。
この結果を見ながら、処理を実装していった。