最近アレルギーの根治治療として舌下免疫療法というのを始めたのですが、その薬を飲んだかどうか忘れることがよくあるので確認できるようにしました。
以前LINEとGASで家計簿アプリを作ったので、そこに乗っける形で機能を追加したいと思います。
簡単に言うと、ユーザーインターフェースがLINE、サーバーサイドがGAS、DBがスプレッドシートなイメージです。
LINEとGASでのアプリ作成について気になる方は上記リンクから見てみてください。
この記録に加えて、以前作成した通知機能で毎日薬飲んだか聞いてくれればもう飲み忘れはないはず。
追記:飲み忘そうになったので修正しました→毎日薬飲んだかGASが聞いてくれるのに記録し忘れてしまうので記録するまでしつこく聞いてくるようにする
コード
大したことしていないのでパッと載せてしまいます。LINE側はコード書かないのでGAS側だけです。
家計簿アプリとして使っているので今回の機能としては余計なコードがありますが、
・ユーザーから「飲んだ」というメッセージを受けたらシートに日時を記録し記録した旨を返信する
・ユーザーから「飲んだ?」というメッセージを受けたら記録を確認して前回記録した日時を返信する
という内容です。
Lineからメッセージを受け取るときの受け口です。
function doPost(e) {
try{
const event = JSON.parse(e.postData.contents).events[0];
const userMessage = event.message.text;
const replyToken = event.replyToken;
const talkType = event.message.type;
let talkID = "";
if (event.source.type === "group") {
talkID = event.source.groupId;
} else if (event.source.type === "room") {
talkID = event.source.roomId;
}else if(event.source.type === "user"){
talkID = event.source.userId;
}
test_sheet.getRange("A1").setValue(event);
const genre_list = ['収入','固定費','変動費'];
const genre_reg = new RegExp('^' + genre_list.join('$|^') + '$');
const genre_mth_reg = new RegExp('^(0?[1-9]|1[012])月(' + genre_list.join('$|') + '$)');
const category_list = getCategoryList();
const category_reg = '^' + category_list.join('$|^') + '$';
const cat_reg = new RegExp(category_reg);
const category_month_reg = '(' + category_list.join('$|') + '$)';
const cat_mth_regexp = new RegExp('^(0?[1-9]|1[012])月' + category_month_reg);
let message = "";
if (talkType == "text"){
const this_month = fiscalMonth(Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy/M/dd'));
if (userMessage === "debug") {
message = tellID(event);
}
~~~~~~~~~~中略~~~~~~~~~~
//今回この2つの条件を追加した
else if (userMessage.match(/^のんだ$|^飲んだ$/)){
message = logMedicine();
}
else if (userMessage.match(/^のんだ?$|^飲んだ?$/)){
message = checkMedicineLog();
}
}
~~~~~~~~~~中略~~~~~~~~~~
replyMessage(replyToken, message);
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}catch(e){
test_sheet.getRange("A1").setValue("エラーおきた\n" + e);
}
}
薬飲んだ日時の記録をスプレッドシートにしていきます。そのシートを取得する関数です。
こういう風に関数化した方が何度も呼び出すときは早いらしい。(今回はそんな呼び出さないけど)
function getMedicineLogSheet() {
if (getMedicineLogSheet.medicine_sheet) { return getMedicineLogSheet.medicine_sheet; }
getMedicineLogSheet.medicine_sheet = SpreadsheetApp.openById(SHEET_KEY).getSheetByName('薬チェック');
return getMedicineLogSheet.medicine_sheet;
}
doPost()で呼び出される関数がこちら。
大したことはしてません。
//薬チェックシートに日時と飲んだことを記録する。
function logMedicine() {
const sheet = getMedicineLogSheet();
sheet.appendRow([Utilities.formatDate(new Date(),"JST","yyyy/MM/dd HH:mm:ss")]);
return message = '記録しました';
}
//薬チェックシートの最後の飲んだ記録を返す。
function checkMedicineLog(){
const sheet = getMedicineLogSheet();
const lastRow = sheet.getLastRow();
const lastLog = sheet.getRange(lastRow,1).getValue();
let message = "";
if(lastLog instanceof Date){
message = "前回飲んだ日時です。\n" + Utilities.formatDate(new Date(lastLog),"JST","yyyy/MM/dd HH:mm:ss") + "\n飲んだら「飲んだ」で記録!"
}else{
message = "前回飲んだ日時が見つかりませんでした。"
}
return message;
}
まとめ
薬は用法容量を守って正しく服用しましょう。
難しい場合は工夫しましょう(自戒)
コメント