見出し画像

#81 スプレッドシートの内容をカレンダーに書き出す(年間&更新可能)

以前に紹介したスプレッドシートの内容を、カレンダーに書き出すプログラム。

わたし自身の現状では、月単位に予定が入力できればいいので、重宝しているのですが…
学校現場のニーズとしては、月単位ではなく、年単位で書き出すプログラムが望まれているようで、「G-Apps.jp Community」の Facebook グループ(※無料で参加できるが、教育者限定)に

【したいこと】
①指定されたカレンダーの1年間(4/1~3/31)の終日予定→スプシに、年・月・日を保持した状態でエクスポート
② ①の情報をもとに、下記スプシに表示を整える。
*できたら嬉しいこと
③スプシの行事予定を変更すると、「すぐに」or「3分後」に、Google Calendarに自動的に反映してくれる。
・懸念点…既にカレンダーにインポート済みの行事とダブってしまいそう…。
1年間(4/1~3/31)の終日予定の全削除→インポートというプロセスのGASを組めばいける…?
④スプシでインポートとエクスポートボタンを押せば、読み込み、上書きができるようになる…?

といった質問が寄せられていました。

冒頭の #04 のプログラムや、Web 上で配布されている同様のプログラムも、カレンダーに書き出すものの、常に予定(イベント)を新規作成するので、予定が変更になるなどして上書きすると、重複して登録されるようになっていました。

似たようなニーズは、これまでも聞いていたので、上記の質問の流れとは違う部分もありますが、

  • スプレッドシートからカレンダーに予定を書き出す。

  • 年間スケジュールを一括して書き出す

  • 予定の修正/変更が行える

という機能を備えたプログラムを作ってみようと思います。


仕様の確認

どのようなプログラムにするのかを、以下のように考えてみました。

(1) 書き込むカレンダーは、UI によって変更できる

これは、以前に紹介している ↓ の #04 のプログラムと同様に、自身が利用しているカレンダーの一覧を表示して、その一覧から書き出すカレンダーを選択できるようにするものです。

プログラム中に、書き出すカレンダーを設定すると、汎用性がなくなったり、利用に対するハードルがあがったり、というデメリットがあるように感じられるので、この仕様は残したままにします。
言い換えると、#04 のプログラムをベースに作っていきます。

(2) 休日設定をもっと簡単にする

前述の #04 のプログラムでは、安藤先生の「GIGAch」で公開されていた同様のスクリプトを参考に、曜日判定・休日判定・うるう年判定、セルへの色付けなどを行っています。
これらの処理は、GAS ではなく、Google スプレッドシートの機能(関数、条件付き書式 など)によって実現しています。

  • #04 からの変更で、シート側の一覧表を作成するのに、プログラム作成と同じくらいの時間を要していたりします… 😅

上記の休日判定を行うためには、対象となる休日の一覧を下図のように設定しなければなりません。年度が替わったときには、この一覧を更新しなければならないのですが、ついつい忘れてしまうのです。

設定する休日の一覧

この休日の一覧を公開されている以下のカレンダー「日本の祝日」から、対象となる休日を取得して、上図のような休日の一覧を作成するようにします。

ja.japanese#holiday@group.v.calendar.google.com

シート左上で、対象となる年度を指定したら、対象となる年度の休日を取得できるボタンを設けておきます。この年度の設定値と、休日の一覧の先頭データの「年」を比較すれば、必要な休日の一覧を取得しているかどうかの判定も行えるはずです。

セル A1 で対象となる「年」を指定

(3) 予定の更新に対応する

カレンダーに登録した予定(イベント)は、Class CalendarEvent として記録されています。同じ日に複数の予定が登録できるため、過去に登録した予定を更新したいのであれば、その Class CalendarEvent の ID を取得しなければなりません。
この Class CalendarEvent の ID を使わずに、新規作成すると予定が重複して登録されてしまいます。

Class CalendarEvent の ID をどのように管理するのかは、いろいろな方法が考えられます。例えば…

  1. それぞれの日付に対応した表を用意しておき、その表にその日付の予定を作成したら、Class CalendarEvent の ID を記録しておく。予定を更新する場合には、記録しておいた ID を用いて更新する。

  2. Class CalendarEvent の ID を記憶しておかず、処理を行う際に、それぞれの日付に登録されている予定を取得して、「終日イベント」が登録されていれば、その予定を更新する。

といった方法が考えられます。前者の方が処理が簡単に行えそうなので、今回は前者の方で進めようと思います。

後者の場合、以下のような懸念もあったので、今回は選択を見送りました。

  • 登録されている予定の有無を必ずカレンダーの API を呼び出さなければならず、時間がかかりそう。

  • 登録されている予定が「終日イベント」であるかどうかの判断もおこなわなければならない。

また、処理が煩雑にならないように、それぞれの日付には 1つの「終日イベント」を登録することとします。この点については、前述の #04 よりも使用的に劣っている部分かもしれません。

(4) 予定には「詳細」も設定可能に

1つの日付に 1つの予定しか登録できない分、予定には「件名」(API の説明では Title)の他に「詳細」(同様に Description)を設定できるようにします。

  • 予定についての詳細な情報を「詳細」に設定しておけば、カレンダーでその予定を選択することで、それらを確認できるようになります。

  • 同様に列を増やせば、「詳細」だけでなく、「場所」にも対応できるのですが、列(欄)が増えすぎると一覧性が下がってしまうので扱いませんでした。

(5) 自動更新はしない

スプレッドシートで行われた編集作業については、↓ の記事で扱ったように変更したことを検出できないわけではないので、定期的(冒頭の要望であれば、変更後すぐ or 変更して 3分後)に編集された内容をカレンダーに反映させることも可能ですが、処理が煩雑になるので今回は扱いません。
→ 要望の ③ の自動的な反映は行わない。

手作業で操作することによって、スプレッドシートの内容をカレンダーに書き出すことにします。カレンダーからの読み込みについても、データを方向をやり取りする方向が逆(set → get)になるだけなので、できないことではないのですが、カレンダー側に同じ日付に複数の予定が登録されていたり、「終日イベント」ではない予定が登録されていたり、と想定外の事象が発生した場合の対応がていぎしづらいので、これも今回は扱いません。
→ 要望の ④ はカレンダーへの「書き出し」のみで、カレンダーからの「読み込み」には対応しない。

作成したプログラム

作成した Google スプレッドシートは、シート「カレンダー情報」とシート「年間行事予定」という 2つのシートと、GAS のプログラムで構成されています。

  • シート「カレンダー情報」
    → #04 から変わっていません。

  • シート「年間行事予定」
    → #04 では月単位だったものを年単位に変更しています。

シート「カレンダー情報」
シート「年間行事予定」

使用する場合には、対象となるカレンダーにアクセスできる Google アカウントでログインした状態で、以下の URL にアクセスして、スプレッドシートをコピーしてください。

https://bit.ly/tomo_081

  • 利用件数を確認するために Bitly の短縮 URL で掲載するようにしました。

プログラムをはじめて実行する際には、アカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。

実際のプログラムは、以下のような感じで 270行余りとなっています。冒頭の 70行くらいは、#04 のプログラムからほぼ変わっていません。それ以降の部分が、今回のプログラムとして作成した部分です。

機能追加 2023/02/25

以下の記事で説明している機能をシート「カレンダー情報」に追加しました。詳細は、以下の記事を参照ください。

使い方

1.シート「カレンダー情報」の設定

シート「カレンダー情報」では、「登録カレンダー 取得」ボタンを押して、実行しているアカウントが利用しているカレンダーを取得します。
この取得したカレンダーの情報を、以降のシート「年間行事予定」での処理で利用します。

この操作については #04 と変わりないので、詳細については ↓ の記事をご覧ください。※「登録カレンダー 取得」ボタンを押すだけなので、確認することはないと思いますが…

2.シート「年間行事予定」

シート「年間行事予定」では、次のように操作します。

  1. セル A1 に対象となる年度を西暦で入力する。
    ※令和 4年度であれば、2022 を入力。

  2. 年度を変更した場合には、下図のように「休日取得」ボタンを押すように促されます。
    指示に従って、「休日取得」ボタンを押して対象年度の休日情報を取得します。

  3. セル F1:K1 で、登録の対象となるカレンダーを選択する。
    ※シート「カレンダー情報」で取得したカレンダーの一覧を、プルダウンメニューで選択。

  4. 「件名」と「詳細」に入力して、「書き出し」ボタンを押すと、シートの内容でカレンダーに予定が登録されます。

  5. 「詳細」の入力を行わないのであれば、「詳細 隠す」「詳細 表示」によって、「詳細」の欄を表示/非表示を切り替えられます。

「休日取得」ボタンを押すように促される場合
「詳細 隠す」「詳細 表示」

シートの下部には、使い方の説明もまとめておきました。

使い方の説明も記載

更に下部には、登録した予定の ID を記録しておくための表が、「件名」と「詳細」を入力する表と同じ様式で用意してあります。この表にはプログラムが ID を記録してくれるので、手入力で編集しないでください。 ※これらのセルには保護を設定してあります。

登録した予定の ID を記録しておくための表 ※手入力で編集しないこと!

3.必要に応じて予定を全削除

登録するための「件名」「詳細」を入力する表の下に、プログラムの使い方を説明してあります。
その説明の中に「予定全削除」ボタンを用意していあります。このボタンを使うことで、当該年度のカレンダーに登録されている予定を全削除できます。必要に応じて使用してください。

「予定全削除」ボタンで、当該年度の予定を全削除

最後に

今回のプログラムは、#04 を焼き直し、冒頭の質問や何度か聞こえてきていた要望を満たすように作った感じとなっています。
個人的には、年度初めに一括登録したあと、変更が生じた場合には、Google カレンダー側で修正した方が簡単なのではないか、と思ったりしないではないのですが… 恐らくは、従来のような表形式で一覧にしたいのだろうな、と思っています。
こんな要望(ニーズ)も、GAS のプログラムによって実現できてしまいます。👍 冒頭の質問も、↓ のような校務自動化の取り組みについて扱う「自動化工房『楽』」でやり取りされているので、興味のある教育関係者はぜひご参加ください。

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。

  • コメントを含めても 350行くらいのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。
「スキ ♡」を押してもらえると、このようなプログラム作成の励みになります。😍

この記事が気に入ったらサポートをしてみませんか?