子育てエンジニアブログ

子育てに励むシステムエンジニア(SE)のブログ

【GAS】GASを使ってGoogleカレンダーの情報を検索してスプレッドに書き込む方法

Googleカレンダー便利ですよね。
でもヘビーユーザだと予定を入れまくりすぎて、あの予定いつだったっけ?とかってなることないですか?
予定がいっぱい入りすぎているとどこに入れてたっけ?っとなり見つからなくてイライラ。
探すのに時間がかかってしまうということがありました。

なので今回は、GASを使ってGoogleカレンダーの情報を検索してスプレッドに書き込む方法についてです。

まずは作ったものの仕様から。
今回は、カレンダーID(メールアドレス)、キーワード、何日前から、何日後までという情報を入力して、カレンダーのタイトルか、説明にキーワードに引っかかった結果をスプレッド上に書き込むという仕様です。

コードを登録して、スプレッドを開くとメニューというのが一番右にでます。

メニュー。

マウスを上に乗せると、カレンダーの予定を出力すると出るのでクリックすると実行されます。

カレンダーIDかgメールのアドレスを入力します。

検索したいキーワードを入力します。

何日前から検索するか、入力します。


何日後まで検索するか、入力します。

結果は次のようになります。1件しか引っ掛からなかったので1件しか出てませんが、普通に複数件でます。

入力チェックとかしていないので、変な入力すると多分動かないです。
ある程度正しい入力で使ってください。

では、ソースコードを全文載せます。
コピペして貼り付けてもらったら、そのまま使えます。
最初のカレンダーID(メールアドレス)の入力がめんどくさい人はソースを修正して固定で入れてください。

function onOpen() {
    const ui = SpreadsheetApp.getUi()
    const menu = ui.createMenu('メニュー');
    menu.addItem('カレンダーの予定を出力する', 'getCalenderEvent');
    menu.addToUi();
}

function getCalenderEvent() {
    const ui = SpreadsheetApp.getUi();
    //アクティブなスプレッドシート、シートを取得
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    // カレンダーIDの入力
    let response = ui.prompt('メールアドレスもしくはカレンダーIDを入力してください', ui.ButtonSet.OK_CANCEL);

    // キャンセル時はスクリプトを終了する
    if (response.getSelectedButton() == ui.Button.CANCEL) {
        return;
    }
    // カレンダーIDを取得する
    let calendarId = response.getResponseText();
    // キーワードの入力
    let response2 = ui.prompt('キーワード', ui.ButtonSet.OK_CANCEL);
    // キャンセル時はスクリプトを終了する
    if (response2.getSelectedButton() == ui.Button.CANCEL) {
        return;
    }
    // カレンダーIDを取得する
    let keyword = response2.getResponseText();

    // キーワードの入力
    let response3 = ui.prompt('何日前から', ui.ButtonSet.OK_CANCEL);
    // キャンセル時はスクリプトを終了する
    if (response3.getSelectedButton() == ui.Button.CANCEL) {
        return;
    }
    // 過去日を取得する
    let beforeDay = response3.getResponseText();

    // 未来日の入力
    let response4 = ui.prompt('何日後まで', ui.ButtonSet.OK_CANCEL);
    // キャンセル時はスクリプトを終了する
    if (response4.getSelectedButton() == ui.Button.CANCEL) {
        return;
    }
    // 未来日を取得する
    let futureDay = response4.getResponseText();

    //カレンダーのIDを指定して、Googleカレンダーを取得する
    let myCalendar = CalendarApp.getCalendarById(calendarId);
    let now = new Date();
    let startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - beforeDay);
    let endDate = now;
    endDate.setDate(startDate.getDate() + futureDay);

    //開始日~終了日に存在するGoogleカレンダーのイベントを取得する
    let myEvent = myCalendar.getEvents(startDate, endDate);
    // 結果格納用の配列
    let result = [];

    //forループの処理で取得したイベントを出力する
    for (let i = 0; i < myEvent.length; i++) {
        let title = myEvent[i].getTitle();
        let description = myEvent[i].getDescription();
        let startHour = myEvent[i].getStartTime().getHours();
        let startMinute = myEvent[i].getStartTime().getMinutes();

        //キーワードがカレンダーのタイトルもしくは詳細に含まれているか。含まれていなければ次へ
        if (title.indexOf(keyword) == -1) {  
          if(description.indexOf(keyword) == -1){ 
            continue; 
          }
        }
        
        // 結果用の配列にまとめて追加する
        result.push([Utilities.formatDate(myEvent[i].getStartTime(), "JST", "YYYY/MM/dd") + ' ' + startHour + '時' + startMinute + '分' + title + description]);

        // アクティブセル取得する
        let activeCell = sheet.getActiveCell();
        // アクティブセルから、書き込み範囲を取得
        let range = sheet.getRange(activeCell.getRow(), activeCell.getColumn(), result.length, result[0].length);

        // シートに出力
        range.setValues(result);
    }
}

以上、GASを使ってGoogleカレンダーの情報を検索してスプレッドに書き込む方法についてでした。