勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

GASとGoogleカレンダを連携し暦通りではない店休日を取得する方法

  Google Apps Script Google

小売店等のサイトで営業日カレンダーみたいなものを表示させる際に今まではPHPで管理画面を作成し、そちらで店休日を登録してもらい、そのデータをカレンダーに反映させるという形を取っていた。この形でも不満は無いんだけどGASとGoogleカレンダーを使えばもっと簡単にできそうに思ったので実装方法をメモ。

 

今回やりたいこと

Googleカレンダーに店休日を登録→GASで作ったAPIにアクセスすると店休日の日付を取得できるという一連の流れを作りたい。

 

Googleカレンダーの準備

Googleカレンダー→設定→マイカレンダーの設定→店休日用のカレンダーを指定と進むとカレンダーIDが表示されるのでメモっておく。

 

スプレッドシートの準備

スプレッドシートのシート名を「holiday」に変更しておく。

 

GAS(API側)

ソースコード

function setHoliday(){

    //開始年月日と終了年月日の指定
    const now = new Date();
    const start = now.getFullYear() + '-01-01';
    const end = (now.getFullYear() + 1) + '-12-31';

    //Googleカレンダーから祝日取得
    const calendar = CalendarApp.getCalendarById('【カレンダーID】').getEvents(new Date(start), new Date(end));

    //祝日データを整形して配列に格納
    const result = [];
    for( var i = 0; i < calendar.length; i++ ){
        result[i] = [
            Utilities.formatDate(calendar[i].getStartTime(), 'JST', 'yyyy-MM-dd'), 
            calendar[i].getTitle()
        ];
    }

    console.log(result);
    return false;

    //正常にデータが取得できた場合、スプレッドシートに書き込み
    if( result.length ){

        //スプレッドシートの読み込み
        const sheet = SpreadsheetApp.getActiveSpreadsheet();

        //シートを指定
        const holidaySheet = sheet.getSheetByName('holiday');

        //シートにまとめて書き込み
        holidaySheet.getRange(1, 1, result.length, result[0].length).setValues(result);
    }
}

//祝日データをJSON出力
function getHoliday(){

    //スプレッドシートの読み込み
    const sheet = SpreadsheetApp.getActiveSpreadsheet();

    //シートを指定
    const holidaySheet = sheet.getSheetByName('holiday');

    //シートのデータを取得
    const holidaySheetVal = holidaySheet.getDataRange().getValues();

    //年月日の整形
    for( let i = 0; i < holidaySheetVal.length; i++ ){
        holidaySheetVal[i][0] = Utilities.formatDate(holidaySheetVal[i][0], 'JST', 'yyyy-MM-dd');
    }

    //データをJSON化
    const payload = JSON.stringify(holidaySheetVal);

    //Textoutputオブジェクトを生成
    const output = ContentService.createTextOutput();

    //Mime TypeをJSONに設定
    output.setMimeType(ContentService.MimeType.JSON);

    //データ出力
    output.setContent(payload);

    return output;
}

//API呼び出し時に動作する関数
function doGet(e){
    const key = e.parameter.key;
    const apiKey = '【接続用キー】';

    if( key != apiKey ){
        return ContentService.createTextOutput('アクセスできませんでした。');
    }

    return getHoliday();
}

カレンダーIDは先ほどメモったものに書き換え、接続用キーは適当なパスワードを設定すること。

デプロイ

外部から接続できるようデプロイの必要あり。

「右上のデプロイボタン→新しいデプロイ」に進み「説明」は適当、「種類の選択」はウェブアプリ、「次のユーザーとしての実行」を自分、「アクセスできるユーザー」を全員で設定する。

何故か初回デプロイ時は「アクセスできるユーザー」に全員の選択肢が無かった。「デプロイを管理→アーカイブ」で削除すると2回目以降からは全員を選択できた。

尚、デプロイに成功すると以下のようなURLが発行されるのでメモっておく。

https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxx/exec

 

PHP(リクエスト側)

<?php
$api = file_get_contents('https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxx/exec?key=【接続用キー】');
$holiday = json_decode($api, true);

//JSONファイル用の制限時間
$holiday['limit'] = date('Y-m-d H:i:s', strtotime('+1 day'));

//JSONファイル上書き保存
file_put_contents('./holiday.json', json_encode($holiday));

接続用キーはGAS側と揃えること。

実行するとholiday.jsonファイルが生成される筈。生成されない場合はフォルダのパーミッションを確認する。

 

所感

基本的には以前作成した祝日APIの形で対応できた。こっちの方が工数がかからないし、お客様にとってはGoogleカレンダーの方が使いやすいといった場合もありそうなので引き出しとして持っておきたい。

 - Google Apps Script Google

  関連記事

GASとGmailを連携させて受信メール検索及びメール送信

Google Apps ScriptとGmailを連携させてみたい。「未読かつ特 ...

GASとLINEを連携させて通知メッセージを送る方法のメモ

Google Apps ScriptとLINEを連携させ、LINEに何らかの通知 ...

GASで「小説家になろう」サイトの更新通知をLINEに送る方法

Google Apps Scriptの勉強として「小説家になろう」サイトの特定小 ...

GASとGoogleアナリティクスを連携させ昨日分のアクセス数TOP3位のページタイトル及び合計アクセス数を取得する方法

GASとGoogleアナリティクスを連携させて「昨日分のアクセス数TOP3位のペ ...

GASで特定サイトにログインした後にスクレイピングを行う方法

Google Apps Scriptの勉強として特定サイトにログインし、その後に ...