回答編集履歴

1 ついき

papinianus

papinianus score 9326

2019/02/21 14:15  投稿

postSlackを実行するのではなく、参考リンクのようにjsonにしてreturnしましょう
postSlackを実行するのではなく、参考リンクのようにjsonにしてreturnしましょう
方針としては、メッセージ取得部分を切り離して、トリガーでコールされたときと、doPost(slack command)でコールされたときで、それぞれのハンドラが何をするか制御したほうがいいですね。
ただこうしたとき、時刻トリガで動作したときに、遅延がなくてもメッセージが送られてしまいますね
それがいやだとなると、ちょっと面倒(既存コードのコピペですまないので、自分で考えてほしいです)
```javascript
const slackAccessToken = PropertiesService.getScriptProperties().getProperty('slack APIで取得した Verification TOKEN');
function triggerDriver() {
 const slackApp = SlackApp.create(slackAccessToken);
 // 対象チャンネル
 const channelId = "#train_info";
 const options = {
   // 投稿するユーザーの名前
   username: "train_info",
   icon_emoji: ":train:",
 }
 const currentDate = new Date();
 const weekday = currentDate.getDay();
 const date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分');
 if (weekday === 0 || weekday === 6) {
   return;
 }
 const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
 if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
   return;
 }
 const infos = getMessages();
 postMessage(infos, 'slack APIで取得した Webhook Address');
}
function doPost(e) {
   const infos = getMessages();
   const res = {"text": infos};
   return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
}
function getMessages() {
 //soubu line info
 const soubuLine = clipInfo("総武線", UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/40/0/").getContentText());
 //tokyometro tozai line info
 const tozaiLine = clipInfo("東西線", UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/135/0").getContentText());
 // JR Chuo line info
 const chuoLine = clipInfo("R中央線(快速)", UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/38/0").getContentText());
 return soubuLine + "\n" + tozaiLine + "\n" + chuoLine + "\n";
}
function clipInfo(line, content) {
 if(content.indexOf('現在、事故・遅延に関する情報はありません。') > -1){
   return "◆" + "は平常運転です";
 }
 const currentDate = new Date();
 const date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分');
 const yahoodatastart = content.indexOf('og:description" content="') + 25;
 const yahoodataend = content.indexOf('の情報です。');
 const yahoodataoutput = content.substring(yahoodatastart, yahoodataend);
 return "◆" + line + date + "\n" + yahoodataoutput ;
}
function postMessage(message, hookpoint){
 var payload = {
   "text": message,
   "channelId": '#train_info',
   "userName": 'train_info',
   "icon_emoji": ':train:'
 }
 var options = {
   "method": "POST",
   "payload": JSON.stringify(payload),
   "headers": {
     "Content-type": "application/json",
   }
 }
   var response = UrlFetchApp.fetch('slack APIで取得した Webhook Address',options);
 if (response.getResponseCode() == 200) {
   return response;
 }
 return false;
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る