GASと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カレンダーの方が使いやすいといった場合もありそうなので引き出しとして持っておきたい。
関連記事
-
-
GASのプログラム実行時間計測方法と各種制限についてのメモ
PHP等でプログラムを組んでいると、あまり実行時間について気にすることはなかった ...
-
-
GASとDrive APIを組み合わせて画像やPDFファイルをOCR処理する方法
Googleドライブに保存した画像やPDFファイルをOCR処理し、ファイル内のテ ...
-
-
GASを使ってみて感じたメリットとデメリット
Google Apps Scriptを色々勉強した中で感じたメリットとデメリット ...
-
-
GASでNintendo Storeをチェックし指定したソフトが〇円以下の際に通知する方法
Google Apps Scriptを利用してNintendo Storeをスク ...
-
-
GASとGmailを連携させて受信メール検索及びメール送信
Google Apps ScriptとGmailを連携させてみたい。「未読かつ特 ...