見出し画像

【自動日記ツール】GoogleCalendarから情報を取得する


年末に今年一年を振り返るために、毎日の出来事が自動的に日記として生成されていてほしいのだ。

そんな欲望をもとに考えた一連の仕組みがあるので、今日は、それを紹介します。

今回は、Googleスプレッドシートを使用してGoogleCalendarから情報を取得する仕組みです。

今回の記事は、これ単独でもいろいろな使い方ができそうなので、記事をわけています。

本記事だけを読んでも意味がわからないと思いますが、もし、興味のある方は、一連の流れを以下の記事、マガジンにしていますので、こちらをご参照ください。

全体の説明はこちら

今回は、以下の工程の中の「GAS経由でカレンダーから情報を読み出す」から「Googleスプレッドシートにリスト化」の部分です




Google App Scriptを作成する


  • 任意のスプレッドシートで、「拡張機能」>「Apps Script」を実行します

    • 自動ツールの一連の流れで作成したものがある場合、そのツールで行います。

    • 単にCalendarから情報を抜き出したいだけであれば、どのスプレッドシートでも構いません

  • 「<>エディタ」のところに、何もコードが入っていないと思いますので、場所を用意します

「無題のプロジェクト」のところはなんのタイトルをつけてもよいです。
「コード.gs」のところも、わかりやすいように名前をつけておきます。
これはどのような名前でも大丈夫です

スクリプトプロパティの設定

  • 「歯車マーク プロジェクトの設定」を開きます

  • 画面下部にスクロールすると、「スクリプト プロパティ」というものがありますので、「スクリプト プロパティを追加」を押下します。

  • スクリプト プロパティには、以下の内容を入れてください。

    • このとき、「プロパティ」の名前は、ここで指定している文字と、一字一句間違えないように入れます

    • GASで呼び出す名前になるため、間違えた名前で呼ぶと動かないためです

  • GCalendarID

    • 情報を取得するカレンダーです

    • 以下のサイトを参考にカレンダーIDを見つけて、「値」に入力します


コードの入力

  • ついにこの時が来ました。

  • GoogleAppScript(GAS)の入力を行います。

  • 先ほど名前を変えたエディタにある「定時に情報取得.gs」の中を全部消して、↓のコードを入力し、保存します。

function listWeeklyCalendarEvents() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GCalendar');
 if (!sheet) {
   // 'GCalendar' という名前のシートがない場合、新しく作成する
   sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('GCalendar');
 }
 sheet.clearContents();


 // スクリプトプロパティからカレンダーIDを取得
 var calendarId = PropertiesService.getScriptProperties().getProperty('GCalendarID');
 if (!calendarId) {
   Logger.log('GCalendarID が見つかりません。');
   return;
 }


 var calendar = CalendarApp.getCalendarById(calendarId); // スクリプトプロパティに保存されたカレンダーIDを使用


 var now = new Date();
 var startOfWeek = new Date(now);
 if (now.getDay() === 0) { // 日曜日の場合、前週の月曜日に設定
   startOfWeek.setDate(now.getDate() - 6);
 } else {
   startOfWeek.setDate(now.getDate() - now.getDay() + 1); // 月曜日に設定
 }
 startOfWeek.setHours(0, 0, 0, 0); // 0時に設定


 var endOfWeek = new Date(now); // GASを実行した現在の日時を取得
 endOfWeek.setHours(now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());


 var events = calendar.getEvents(startOfWeek, endOfWeek);
 sheet.appendRow(['日付', '件名', '説明']); // ヘッダー行を追加


 for (var i = 0; i < events.length; i++) {
   var date = Utilities.formatDate(events[i].getStartTime(), "JST", "yyyy/MM/dd"); // 日付をyyyy/MM/dd形式にフォーマット
   var details = [
     date,                   // 日付 (yyyymmdd形式)
     events[i].getTitle(),    // 件名
     events[i].getDescription() // 説明
   ];
   sheet.appendRow(details);
 }
}



このコードは、スクリプト プロパティで設定した「GCalendarID」からカレンダー情報を呼び出し
実行した日付の月曜日〜日曜日の一週間分データを抽出するコードです

1年間のスケジュールを取得することもできるので、技術がある方は必要に応じて修正して大丈夫です。
なお、私はScriptは書けないので、このコードは完全にGPT由来の天然物です。その品質に保証はありませんが、エラーがでても、そのエラーコードをGPTなりBingなりに送ればなんとかなります。

カレンダーIDも、スクリプトプロパティから取得するので、外に漏れることはありません。安心して動かしていきましょう。

保存したら、「▷ 実行」で動かしてみましょう。

スプレッドシートの「GCalendar」シートに、一週間分のデータが反映されていたら成功です。

トリガーの設定

  • 左側のメニュー「時計マーク トリガー」を押下します

  • 画面右下の「 + トリガーを追加」を押下します

  • 「実行する関数を選択」は、さきほど作成した「定時に情報取得.gs」に入れたコードから「listWeeklyCalendarEvents」というfunction名を選択します。

  • 現在は、対象のGASを1時間おきに実行する(毎時間カレンダーからスプレッドシートに情報が反映される)内容になっていますが、それらは、好きなように変更して構いません

    • Google同士の情報連携で、費用はかかりません

これで、カレンダーからスプレッドシートに情報を移す仕組みができました!
コングラッチュレーション!!

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