Created
March 25, 2018 14:39
-
-
Save ryotaikeuchi/12ecea01cb4cdc82b5ad0d50bf2908b3 to your computer and use it in GitHub Desktop.
「乗換駅に着いたら次の電車までの時間を声で知らせてくれる」のためのGoogle Apps Scriptのコード.Google Spreadsheetの時刻と,時刻表データをもとに動作する.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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