実現したいこと
Slackのチャンネルにスラッシュコマンドを投稿したら、天気予報をpost投稿するようにしました。GASを利用しており、ライブラリは、SlackAppとSlack Apiの利用しています。
#予定チャンネルに投稿したいのですが、GAS側のエラーが解消できません。エラーで失敗した投稿と正常に結果を返す投稿の合わせて2投稿が一緒にpostされて困っています。
main関数で投稿しています。
発生している問題・分からないこと
スラッシュコマンドを利用した際に、GASのdoPost()関数にコードエラーがあるようで、チャンネルにGASのエラーが投稿されています。main()関数で天気予報を投稿しています。
エラーメッセージ
error
1<!DOCTYPE html> 2 <html> 3 <head> 4 <link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"> 5 <title>Error</title> 6 <style type="text/css" nonce="wP9kkBAHoNUxd264f9YYTQ">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style> 7 </head> 8 <body style="margin:20px"> 9 <div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"> 10 </div> 11 <div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">The script completed but did not return anything.</div> 12 </body> 13</html>
該当のソースコード
GAS
1function doPost(e) { 2 3 var slack_token = PropertiesService.getScriptProperties().getProperty('SlackToken'); // Verification Tokenで取得するトークン 4 var params = JSON.parse(e.postData.getDataAsString()); 5 console.log(e.postData.getDataAsString()) 6 7 if (params.type === 'url_verification') { 8 return ContentService.createTextOutput(params.challenge); 9 } 10 const body = JSON.parse(event.body); 11 if (!(body.token === slack_token)) return {"statusCode": 401, "body": "Missing Token"} 12 // 再送かをチェック 13 if (event.headers['X-Slack-Retry-Num']) { 14 return { statusCode: 200, body: JSON.stringify({ message: "No need to resend" }) }; 15 } 16 var channel = postData.event.channel; 17 var ts = postData.event.ts; 18 var cache = CacheService.getScriptCache(); 19 // ここのキーは自由に変えてください。 20 // 今回はメンションに反応するbotなので発言されたチャネルID、タイムスタンプをキーにしました。 21 var cacheKey = channel + ':' + ts; 22 var cached = cache.get(cacheKey); 23 if (cached != null) { 24 console.log('do nothing!'); 25 return; 26 } 27 cache.put(cacheKey, true, 1800); // 30分キャッシュする(ここは目安。もっと短くてもいいかもしれない) 28 main(); 29 30}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
エラー内容は、スクリプトは完了しましたが、何も返されませんでした。このエラーは通常、Google Apps Scriptの関数が値を返さない場合に発生します。
Google Apps Scriptでは、doGetやdoPostなどの関数はHTMLコンテンツや新しいアプリのインスタンスなどの値を返すはずです。これらの関数が何も返さない場合、エラーメッセージが表示されることがあります、という事でした。
また古い情報ではCallbackIDが云々という情報もありましたが、今回はSlackAppなので関係ないように思えました。
CallbackID云々
特に変わらずエラー解消できなかった。
#予定チャンネルがきれいに確認できれば良いので他チャンネルでスラッシュコマンド打って、♯予定チャンネルに投稿されるという方法で凌いでいます。この場合、他チャンネルにエラーが1投稿されて目的の#予定チャンネルに正常な結果『天気予報』だけが1投稿されるので問題はありません。
補足
main()関数はもともと定時実行する、#予定チャンネルに天気予報の投稿をする関数でありトリガーを設定しております。特に支障はなく、定時実行のタイミング若しくはGoogle apps scriptから直接実行した際には、今回のGASのエラーはチャンネルに吐き出しません。
doPost()関数は基本的に、デバッグツールで確認できないので余計に困っています。手動では確認が取れないので途方に暮れています。
Event SubscriptionsのRequest URLには、GASのWeb App URLを登録しています。
Slackボット名やSlach command名などが関係しているのであれば、設定方法自体が誤りかも知れません。

回答1件
あなたの回答
tips
プレビュー