Skip to content

Instantly share code, notes, and snippets.

@ryotaikeuchi
Created March 25, 2018 14:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryotaikeuchi/12ecea01cb4cdc82b5ad0d50bf2908b3 to your computer and use it in GitHub Desktop.
Save ryotaikeuchi/12ecea01cb4cdc82b5ad0d50bf2908b3 to your computer and use it in GitHub Desktop.
「乗換駅に着いたら次の電車までの時間を声で知らせてくれる」のためのGoogle Apps Scriptのコード.Google Spreadsheetの時刻と,時刻表データをもとに動作する.
Const = {
 colNoFromNearHomeWeekday: 0, //時刻表シートの何列目に「平日」,「自宅側からきたとき(=会社方面行き)」の時刻表データが入力されているか
 colNofromNearOfficeWeekday: 1,
}
var sheetTransferStationLog = SpreadsheetApp.getActive().getSheetByName('log'); //乗換駅の到着時刻のログが入力されたシート(時刻はIFTTTのLocationトリガーで自動入力させる)
var sheetTimetableStationLog = SpreadsheetApp.getActive().getSheetByName('timetable'); //時刻表のシート(時刻は予め手動で入力しておく)
var ssNearOfficeStation = SpreadsheetApp.openById('XXXXXXXXXXXXXXXXX'); //会社側の駅の到着時刻のログのスプレッドシート
var sheetNearOfficeStation = ssNearOfficeStation.getSheetByName('シート1'); //会社側の駅の到着時刻のログのシート
var ssNearHomeStation = SpreadsheetApp.openById('XXXXXXXXXXXXXXXXX'); //家側の駅の到着時刻のログのスプレッドシート
var sheetNearHomeStation = ssNearHomeStation.getSheetByName('シート1'); //家側の駅の到着時刻のログのシート
function myFunction(){ //この関数を「値の変更」のトリガーで実行されるように設定する
addTime(); //到着時刻をシートに自動入力する
notifyNextTrainTime(); //次の電車の発車時刻をwebhookする
}
//次の電車の発車時刻をwebhookする
function notifyNextTrainTime() {
var direction = fromWhichStation();
if(direction == "fromNearHomeStation" || direction == "fromNearOfficeStation"){
var value1 = searchNextTrainTime(direction);
if(direction == 'fromNearHomeStation'){
var value2 = '会社方面行き'
}else if(direction == 'fromNearOfficeStation'){
var value2 = '自宅方面行き'
}
   var url = "https://maker.ifttt.com/trigger/notify_next_train/with/key/XXXXXXXX?value1=" + value1 + '&value2=' + value2;
Logger.log(url);
UrlFetchApp.fetch(url);
}else{
Logger.log("他の駅を経由せずに乗換駅にきた(電車でない)");
}
}
function searchNextTrainTime(direction){
var timetable = sheetTimetableStationLog.getDataRange().getValues(); //時刻表データを一旦まるごと取り込む
var _ = Underscore.load();
var timetableTrans = _.zip.apply(_, timetable); //時刻表データの行と列を入れ替え https://tonari-it.com/gas-array-underscore-zip-apply/
//参考: https://qiita.com/k_keisuke/items/c6c9201e3cbdbd27c329
var now = new Date(); //現在時刻
var nowHours = now.getHours();
var nowMinutes = now.getMinutes();
var day = now.getDay(); //曜日(?)
//colNoTimetable(時刻表の何列目を参照するか)を求める (これは曜日と行き先による)
if(direction == "fromNearHomeStation"){
if (day == 0) {
colNoTimetable = Const.colNoFromNearHomeSunday;
} else if (day == 6) {
colNoTimetable = Const.colNoFromNearHomeSatday;
} else {
colNoTimetable = Const.colNoFromNearHomeWeekday;
}
}else if(direction == "fromNearOfficeStation"){
if (day == 0) {
colNoTimetable = Const.colNofromNearOfficeSunday;
} else if (day == 6) {
colNoTimetable = Const.colNofromNearOfficeSatday;
} else {
colNoTimetable = Const.colNofromNearOfficeWeekday;
}
}
var recent = "なし";
var timeUntilNextTrain;
var timeNextTrain = "none";
for(var i = 3; i < timetableTrans[colNoTimetable].length; i++) {
var time = timetableTrans[colNoTimetable][i];
if(time != 0){ //空白セルは「0」で埋めておく(空白セルの判定が分からなかったので…)
var timeHours = time.getHours();
var timeMinutes = time.getMinutes();
if (recent != "なし") {
break;
}
if ( nowHours == timeHours ) {
if ( nowMinutes < timeMinutes ) {
timeNextTrain = time;
recent = "done";
Logger.log("timeNextTrain1:"); Logger.log(timeNextTrain);
}
} else if ( nowHours < timeHours) {
timeNextTrain = time;
recent = "done";
Logger.log("timeNextTrain2:"); Logger.log(timeNextTrain);
}
}
}
if(timeNextTrain == "none"){ //たとえば現在時刻が23時等で,次の電車が0時台のとき
Logger.log("現在時刻を「-24」(「-1時」)にして再度検索する");
var nowHoursMinus = nowHours - 24;
for(var i = 3; i < timetableTrans[colNoTimetable].length; i++) {
var time = timetableTrans[colNoTimetable][i];
if(time != 0){ //空白セルは「0」で埋めておく(空白セルの判定が分からなかったので…)
var timeHours = time.getHours()
var timeMinutes = time.getMinutes();
if (recent != "なし") {
break;
}
if ( nowHoursMinus == timeHours ) {
if ( nowMinutes < timeMinutes ) {
timeNextTrain = time;
recent = "done";
}
} else if ( nowHoursMinus < timeHours) {
timeNextTrain = time;
recent = "done";
}
}
}
}
Logger.log('timeNextTrain:'); Logger.log(timeNextTrain);
Logger.log('now:'); Logger.log(now);
Logger.log('timeUntilNextTrain1:'); Logger.log(timeUntilNextTrain);
timeUntilNextTrain = (timeNextTrain.getHours()*60 + timeNextTrain.getMinutes()) - (now.getHours()*60+now.getMinutes());
if(timeUntilNextTrain <0){ //日付をまたいだ場合
timeUntilNextTrain = (timeNextTrain.getHours()*60 + timeNextTrain.getMinutes()) + 24*60 - (now.getHours()*60+now.getMinutes());
}
Logger.log('timeUntilNextTrain2:'); Logger.log(timeUntilNextTrain);
var returnVar = (' '+timeUntilNextTrain).slice(-3);
Logger.log('returnVar:'); Logger.log(returnVar);
return returnVar;
}
function fromWhichStation(){
var timeAtNearOfficeStation = lastrowValue(3,sheetNearOfficeStation);
var timeAtNearHomeStation = lastrowValue(3,sheetNearHomeStation);
var timeAtTransferStation = lastrowValue(3,sheetTransferStationLog);
Logger.log("timeAtNearHomeStation:"), Logger.log(timeAtNearHomeStation);
Logger.log("timeAtTransferStation:"), Logger.log(timeAtTransferStation);
Logger.log("timeAtNearOfficeStation:"), Logger.log(timeAtNearOfficeStation);
var timeDifferenceNearHomeToTransfer = (timeAtTransferStation - timeAtNearHomeStation)/(60*1000);
var timeDifferenceNearOfficeToTransfer = (timeAtTransferStation - timeAtNearOfficeStation)/(60*1000);
if(timeDifferenceNearHomeToTransfer >0 && timeDifferenceNearHomeToTransfer < 5){
Logger.log("fromNearHomeStation");
return "fromNearHomeStation";
}else if(timeDifferenceNearOfficeToTransfer >0 && timeDifferenceNearOfficeToTransfer < 5 ){
Logger.log("fromNearOfficeStation");
return "fromNearOfficeStation";
}else{
Logger.log("none");
return "none";
}
}
//---時刻の自動入力--------------------------------------------------------------------
// 参考: https://qiita.com/miso_develop/items/be562d8a823ad2639d94
function addTime() {
setTime(2, "yyyy/M/d");
setTime(3, "H:m:s");
Logger.log("addTime done");
}
function setTime(col, format) {
var lastrow = sheetTransferStationLog.getLastRow();
// Logger.log(lastrow);
if (sheetTransferStationLog.getRange(lastrow, col).getValue() == "")
sheetTransferStationLog.getRange(lastrow, col).setValue(formatTime(new Date(), format));
}
function formatTime(date, format) {
return Utilities.formatDate(date, 'Asia/Tokyo', format)
}
function lastrowValue(col,ss){
var range;
if(col==1){
range = ss.getRange("A:A").getValues();
}else if(col==2){
range = ss.getRange("B:B").getValues();
}else if(col==3){
range = ss.getRange("C:C").getValues();
}else{
Logger.log("ERROR: col No of lastrowValue");
}
var lastRow = range.filter(String).length;
Logger.log(lastRow);
range = ss.getRange(lastRow, col);
return range.getValue();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment