GASで電車が遅れたら自動でLINEさせる

GASで電車が遅れたら自動でLINEさせる:


きっかけ

この前、GASを使って「電車が遅延していないか確認して遅れていないかどうかLINEする」という自動化を組んでいました。ただ、毎朝のごとく同じ内容でLINEが来ても見るのが面倒くさくなってしまいます。そこで「電車が遅れている時だけLINE送信、一回遅れたらLINEを送ったことを記録して同じ遅延について複数回もラインを送らせない」という実装にできたので紹介します。


仕組み

電車が遅れていないかを確認するために鉄道遅延情報のjsonを使わせていただきました。

実装としては、上記のjsonのデータから自分が使う路線が遅延していないか確認し、遅れていなければその時点で「遅れていない」とスプレッドシートに記録、遅れていればLINEを送って送信したことをスプレッドシートに記録、二回目以降の実行では電車が遅れていてもスプレッドシートに送信済みと記録されていたら送らず、遅延情報が無くなった時点でスプレッドシートのデータをまた書き換えるという実装です。少しばかり工夫したら二つ以上の路線にも対応できます。


必要物

・Googleアカウント

・インターネット

・LINE Notifyのアクセストークン


実際のコード

複数路線について確認をする際に効率化が効くように「全ての路線において共通で使える処理」と「それぞれの路線で分けないといけない処理」を別にしてプログラムを作成しました。

確認する路線が増えるたびに最初に実行する関数の内容追記とfunction追加を行っていきます。

commonprg.gs
function sendHttpPost(message,token){ 
  //LINEに投げる 
  console.log("sending line..."); 
  console.time("LINE"); 
  var options = 
   { 
     "method"  : "post", 
     "payload" : "message=" + message, 
     "headers" : {"Authorization" : "Bearer "+ token} 
}; 
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 
console.timeEnd("LINE"); 
console.log("sended"); 
} 
 
 
function delayinfo(name,company){ 
   //電車遅延情報をJSONで取得 
   console.log("Fetching DelayInfo..."); 
   console.time("FD"); 
  var json = JSON.parse(UrlFetchApp.fetch("https://rti-giken.jp/fhc/api/train_tetsudo/delay.json").getContentText()); 
  var body=""; 
  for each(var obj in json){ 
    if(obj.name === name && obj.company === company){ 
      body = "遅延しています";  
    } 
  } 
   if(!body){  
    body =body+"0"; 
  } 
 console.timeEnd("FD"); 
 console.log("Fetched delay."); 
 return body; 
} 
 
 
function geth(){ 
var data=new Date(); 
var hours=data.getHours(); 
return hours;} 
 
 
function save(data,id){ 
console.log("savedata-service started as "+id+"with data:"+data); 
console.time("save"); 
//スプレッドシート処理 
var spreadsheet = SpreadsheetApp.openById(id); 
var sheets = spreadsheet.getSheetByName("シート1"); 
var rang=sheets.getRange(1,1); 
var value = rang.getValue(); 
console.log("Fetched savedata:"+value); 
if (value == data){console.timeEnd("save");return 0;}else{ 
console.log("saving:"+data); 
sheets.getRange(1,1).setValue(data); 
console.timeEnd("save"); 
return 1;} 
} 
こちらが全ての路線に共通のコードです。スプレッドシートについてなのですが、自分でスプレッドシートを作ってそのidを取って次の路線別コードに仕込んでください。

[路線名とかの任意の名前].gs
function [任意の関数名](){ 
  //Mainloop 
  var cht=geth(); 
  if (cht<=5){ 
  console.log("Script not to run"); 
  return;} 
  console.log("Mainloop started"); 
  console.time("Main"); 
  //config 
  var train=[路線名]; 
  var company=[鉄道会社名]; 
  var token=[LINE NotifyのPersonal Access Token]; 
  var id=[spreadsheetのid]; 
  //実際の処理 
  var train=delayinfo(train,company); 
  if (train == 0){ 
  console.log("DF blank"); 
  save(0,id); 
  console.timeEnd("Main"); 
  console.log("all done!"); 
  return; 
  }else{ 
  var pap=save(1,id); 
  console.log("savedata-check:"+pap); 
  if (pap == 0){console.timeEnd("Main");console.log("all done!");return;} 
  console.log("sending..."); 
  sendHttpPost(message,token); 
  } 
  console.timeEnd("Main"); 
  console.log("all done!"); 
} 
括弧で覆った所は各自で最適な値に設定してください。

後はこれをGASに入れて、タイマー式自動実行とか組んだら上手く動きます。

一つ注意すべきなのが、路線が一つや二つならやたらと(一分間で一回とか)走らせなかったらGASの制限にかからないと思いますが、路線が増えてきた場合は実行頻度も考えないとわりと簡単に制限に引っかかってしまいます。基準としては一日に一時間以上かけて処理してなかったらいいです。

あと、LINEのトークンの取り方ですが、LINE Notifyのウェブサイトにアクセスし、ログインしてマイページに行くとToken発行が可能です。名前は路線名とかを設定することをおすすめします。

工夫としては、制限から少しでも離れるために、大抵の電車は走ってないであろう午前0時から5時はプログラム6行目で停止するようにして、リソースの消費を抑えています。


今後の課題

さらに工夫を加えて、データをドライブに直に保存できるようにしたい。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)