園児ニアのメモ

ただのエンジニア。何でも屋みたいな扱い受けてます。

【GAS】Googleカレンダーの予定をSNSへ通知

GoogleAppScript(以下GASと略称)でGoogleカレンダーの予定を自分のSNSにお知らせしてくれるツールを作りました。

普段、カレンダーを見る癖がない私ですが、SNSはよく見るのでSNSで自分宛に予定がくれば楽なので...

機能としては

  • 1週間後の予定まで確認(改変可能)
  • 予定の日時、または通知を設定した時刻(予定の10分前など)になったらSNSで自分宛に通知

SNSの部分は今回はChatWorkになっていますが、
仕事の予定はChatWork、個人はTwitterのDMなどの改変可能です。

GASを使用する準備は以下を参考にどうぞ。
madgenius.hateblo.jp

下のソースの最後にも同じ内容が入っていますが、GASでChatWorkに投稿する方法は以下を参考にしてください。
madgenius.hateblo.jp

以下、Googleカレンダーの予定をChatWorkに投稿するソース

/*------------------------------------*
 * 毎分カレンダーから1週間先までの予定を見る。
 * ↓
 * 予定が現在、または通知を登録していた時間だった場合お知らせする
 *------------------------------------*/
function MinuteCheckCalender() {
    //カレンダーからイベントの取得
    var myCals = CalendarApp.getCalendarById('hogehoge@gmail.com'); //特定のIDのカレンダーを取得
    if (myCals != null) { //権限がないなどの時はnullになるので処理をスルーする
        //カレンダーから現在〜1週間後までのイベントを取得
        var startDate = new Date();
        startDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate(), startDate.getHours(), startDate.getMinutes(), 0);
        var endDate = new Date();
        endDate.setDate(endDate.getDate()+7);
        var myEvents = myCals.getEvents(startDate, endDate);
        
        if (myEvents.length > 0) { //カレンダーに予定がない時はスルーする
            //お知らせが必要な予定一覧を作成する
            var strBody = "";
            for(var i = 0; i < myEvents.length; i++){
                var alertTime = -1;
                var strStart = myEvents[i].getStartTime(); //イベントの開始時刻
                //予定の日付と今日が同じかチェックする
                if (startDate.getFullYear() == strStart.getFullYear()) {
                    if (startDate.getMonth() == strStart.getMonth()) {
                        if (startDate.getDate() == strStart.getDate()) {
                            //予定の日時と今が同じ時分かチェックする
                            if (startDate.getHours() == strStart.getHours()) {
                                if (startDate.getMinutes() == strStart.getMinutes()) {
                                    //何分前の通知かを保持
                                    alertTime = 0;
                                }
                            }
                        }
                    }
                }
                        
                var intReminders = myEvents[i].getPopupReminders(); //何分前にお知らせするか
                if (intReminders != null) {
                    if (intReminders.length > 0) {
                        //予定の日時じゃなくても通知が登録されていれば通知時間にお知らせする
                        if (alertTime == -1) {
                            for (var j = 0; j < intReminders.length; j++) {
                                //通知として登録していた日時を取得
                                var minute = intReminders[j];
                                var alertDate = new Date(strStart.getTime());
                                alertDate.setMinutes(alertDate.getMinutes()-minute);
                                
                                //通知の日時と今日が同じかチェックする
                                if (startDate.getFullYear() == alertDate.getFullYear()) {
                                    if (startDate.getMonth() == alertDate.getMonth()) {
                                        if (startDate.getDate() == alertDate.getDate()) {
                                            //通知の日時と今が同じ時分かチェックする
                                            if (startDate.getHours() == alertDate.getHours()) {
                                                if (startDate.getMinutes() == alertDate.getMinutes()) {
                                                    //何分前の通知かを保持
                                                    alertTime = minute;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                
                if (alertTime >= 0) {
                    var strTitle = myEvents[i].getTitle(); //イベントのタイトル
                    var strEvent = "";
                    if (strBody != "") { //他の予定の後に追加する場合は空白行を追加する
                        strEvent += "\n\n";
                    }
                    if (alertTime == 0) {
                        strEvent += "[info][title]予定の時刻です[/title]";
                    } else {
                        if (alertTime < 60) {
                            strEvent += "[info][title]予定の"+alertTime+"分前です[/title]";
                        } else if (alertTime < 24*60) {
                            strEvent += "[info][title]予定の"+(alertTime/60)+"時間前です[/title]";
                        } else {
                            strEvent += "[info][title]予定の"+(alertTime/60/24)+"日前です[/title]";
                        }
                    }
                    strEvent += "件名:"+strTitle+"\n";
                    if (myEvents[i].isAllDayEvent()) {
                        strEvent += "時間:終日\n";
                    } else {
                        var strEnd = myEvents[i].getEndTime(); //イベントの終了時刻
                        strEvent += "時間:"+Utilities.formatDate(strStart,'JST','HH:mm')+"~"+Utilities.formatDate(strEnd,'JST','HH:mm')+"\n";
                    }
                    var strLocation = myEvents[i].getLocation(); //場所
                    strEvent += "場所:"+strLocation+"\n";
                    var strDescription = myEvents[i].getDescription(); //説明
                    strEvent += "説明:"+strDescription;
                    strEvent += "[/info]";
                    if (strEvent != "") {
                        strBody += strEvent;
                    }
                }
            }
            
            if (strBody != "") {
                //ChatWorkに予定一覧を投稿する
                var client = ChatWorkClient.factory({token:"???????????????"});
                client.sendMessage({
                    room_id:00000000,
                    body:strBody}
                );
            }
        }
    }
}
  • 最初のほうの「'hogehoge@gmail.com'」を自分のカレンダーを使っているGoogleのアドレスにしてください。
    • GSuiteなど企業用のアカウントで独自のドメインのものでも可能です。
  • 最後のChatWorkに投稿部分のAPIトークンとルームIDを変更してください。
    • わからない方はソースの上の「GASでChatWorkに投稿する方法」の記事の中で説明していますので参考に。

動作

実際に動かすとこんな感じ。
f:id:nanokanato:20170828110549p:plain:w300
自分から自分に送るのではなく、Bot用のアカウントから自分に送ると通知がくるのでオススメです。
さらにSNSスマホ用アプリを入れておくとPush通知でも確認できます。

現在、終日の場合は「時間:終日」となりますが予定日の0:00に通知がくるのでそこらへんは改変して使ってください。

余談

GASでTwitterにツイートする記事です。
ツイート部分のアドレス(/update.json)を自分宛にDMを送信などにすれば使えます。
仕事の予定はChatWorkに、個人の予定はTwitterのDMになどと使い分けが可能です。
madgenius.hateblo.jp