見出し画像

【GAS活用システム⑧-2】複数カレンダーの予定を月単位で一括削除する

Google Apps Script (GAS)を、もっと身近に、日々の暮らしに。

前回の【GAS活用システム⑧】では、部活の予定表をカレンダーに一括登録してウェブサイトで色分けして表示する方法をご紹介しました。

↑上記のように、ウェブサイトのカレンダーに予定を色分けして表示するために、カレンダーを3つ登録する必要がありました。

そして、スプレッドシートに3つの区分に分けて入力した予定を、各区分に対応するそれぞれ3つのカレンダーにGASでガバッと一括登録しました。

今回は、これらの一括登録された予定(終日イベント)を、GASでガバッと一括削除していきたいと思います。

もちろん、Googleカレンダーから予定を手動で1つずつ削除することは可能です。

ですが、削除したい予定が多いと、手動でちまちま削除するのも結構面倒です。

ガバッと一括登録したので、ガバッと一括削除も可能にしてみましょう。

一括削除の範囲と対象は

カレンダーに登録された予定を一括削除、といった時に、まず、どの範囲のどの予定を削除対象にするかはきちんと明確にしておく必要があります。

今回は、前提として、【GAS活用システム⑧】で登録した予定を一括削除する方法について考えることとします。また、部活の予定は月単位で公開されて登録することが多いようなので、以下を一括削除の範囲・対象としましょう。

  • 削除対象の範囲として、一か月単位のすべての予定を削除するものとする(過去の予定を一括削除する必要性はないと思われるため、今月 or 来月 のすべての予定を削除可能とする)。

  • 【GAS活用システム⑧】の一括登録で使用した、3つのカレンダーを対象とする。

ざっくりいうと、「複数カレンダーの予定を月単位で一括削除する」ということですね。

予定を一括削除するGASの登録と実行

では、さっそくGASの登録をしていきましょう。

予定表のスプレッドシートを開き、メニューバーから、拡張機能 > Apps Script を選択します。

コード.gsに【GAS活用システム⑧】で登録したスクリプトが表示されるのを確認したら、createCalendarEvents関数の後ろに、以下のスクリプトをコピペしましょう。

function deleteAllEvents_thisMonth() {deleteAllEvents(0)}  //今月の予定をすべて削除
function deleteAllEvents_nextMonth() {deleteAllEvents(1)}  //来月の予定をすべて削除

function deleteAllEvents(monthNum=0){
  const today = new Date;
  const startDate = new Date(today.getFullYear(), today.getMonth() + monthNum, 1); 
  const endDate = new Date(startDate.getFullYear(), startDate.getMonth() + 1); 
  console.log(Utilities.formatDate(startDate, 'JST', 'yyyy/MM/dd') + "がStartDate");
  console.log(Utilities.formatDate(endDate, 'JST', 'yyyy/MM/dd') + "がEndDate");

  cals.forEach((calendar) => {    //3つのそれぞれのカレンダーで繰り返し
    //各カレンダーのstartDateからendDateのすべてのイベントを取得
    let events = calendar.getEvents(startDate, endDate);
    //取得したイベントをすべて削除
    events.forEach(event => event.deleteEvent());
  });

  console.log(Utilities.formatDate(startDate, 'JST', 'yyyy年MM月') + "のすべての予定を削除しました");    
}

変更箇所はありません。そのまま、プロジェクトを保存します。

ちなみに、上記のスクリプトにはカレンダーIDの指定はしていません。前回、【GAS活用システム⑧】で一括登録の時に定義した、Mapオブジェクトのcalsで指定したカレンダーを、今回、一括削除でも使用するためです。

前回のスクリプトは残しておいてくださいね

続けていきましょう。保存後、デバッグと実行ログの間のプルダウンをクリックすると、新たに3つの関数が登録されたのが確認できます。

今月の予定をすべて削除する場合はdeleteAllEvents_thisMonth関数を、翌月の予定をすべて削除する場合はdeleteAllEvents_nextMonth関数を実行します。

この2つの関数は最終的には同じdeleteAllEvents関数を実行しています。違いは、( )の中の引数として、0を指定するか、1を指定しているかだけです。図にすると↓こんな感じです。

さて、ここで問題です。今回は登録しませんでしたが、再来月の予定を一括削除する関数を作るなら???

そうですそうです。引数を2にして、deleteAllEvents関数を実行すればいいわけですね。

なお、直接、deleteAllEvents関数を実行した場合、今月の予定を削除します(引数monthNumのデフォルト値を0にしているため)

さて、登録した3つの関数のイメージがつかめて、心の準備ができたら、プルダウンでdeleteAllEvents_thisMonth関数を選択して実際に実行してみましょう。

以下のような実行ログが表示されます。

実際にカレンダーを確認してみると、ザクッと削除されたことがわかります(事前定義された日本の祝日は除く)。

ちなみに、関数の実行が完了してから、実際に予定が削除された状態のカレンダーが表示されるまで、若干のタイムラグがありました。体感では、「実行完了」と実行ログに表示されてから、7~8秒後にカレンダー上から予定が削除されました。「あれ、削除されない!?」と思っても、10秒くらいは待ってみてくださいね。

少しだけコード解説

今回は、各カレンダー毎に、getEventsメソッドで指定した期間(startDateからendDateまで)に発生したすべてのイベントを取得し、個々のイベントをdeleteEventメソッドで削除する、というのが処理の流れです。

ちょっとハマったのが、getEventsメソッドでの期間の指定の仕方です。

始めは、例えば、2023年7月のイベントを削除する時に、startDateに2024/07/01、endDateに2024/07/31を指定しましたが、なぜか末日の2024/07/31の予定が削除されない、という事象が発生しました。

改めて、公式リファレンスのgetEventsメソッドを確認したら、「期間の終了値(この値を含まない)」と記述されており、納得しました。endDateに2024/07/31を指定しても、2024/07/31は期間に含まれないんですね。

ということで、実行ログにも出力していますが、2023年7月のイベントを削除する時には、endDateに2024/08/01を指定するようにしています。

おまけ・メニューバーからの関数実行も可

前回の「予定の一括登録」、今回の「予定の一括削除」の関数ですが、スプレッドシートのメニューバーから実行することもできます。

こうしておけば、スクリプトエディタを起動しなくても、「予定の一括登録」、「予定の月単位の一括削除」ができて、さらに便利になりますよ。

独自メニューを追加する方法は、以下の記事を紹介しています。

半年以上に書いた記事ですが、今回のカレンダー関係の処理を行う関数は、onOpenトリガーに設定するとエラーになってしまうことがわかったので、新たな発見としてこの記事のことを更新しました。

おわりに

「複数カレンダーの予定を月単位で一括削除する」、いかがでしたか。

予定が大幅に変わってしまったら、個々の予定を変更するより、月単位ですべての予定を一括削除して、再度、一括登録した方が楽かもしれませんね。

くどいようですが、今回のスクリプトは、以下の部活の予定表の一括登録を前提にしています。

それでは、また。

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