Google Apps Script を使って、Google Drive 内のファイル検索を行う LINE Botを作成したのですが、この中で2ヵ所はまったので記録に残しておきます。
1. Webhookのテストでエラー出る問題
GAS x LINE Botのブログはたくさんありますが、書かれていなかったんですよね。
LINE Botを作るとき、LINE Developers console の Messaging API のページで、Webhook のURLを設定してテストしますよね。(LINEのメッセージイベントを送る先のURL)
GAS では 「Web アプリケーションとして公開」したときのURLを設定しますが、テストすると毎回エラーになります。
ステータス200を返さないといけないんですが、調べると
return ContentService.createTextOutput(JSON.stringify({status:"success"})).setMimeType(ContentService.MimeType.JSON);
でステータスを返せばOKとかいろいろ出てきます。(多くは何も触れていない)
実際にはどの方法を試みてもエラーです。Postmanで同じURLにリクエスト送ってもちゃんと200OKで返ってくるのでわからず。
結論を言えば、
Webhookのテストで200になっていなくても気にしなくてOK
でした。ちゃんとGASのスクリプト (doPost部分) は実行されていますし、その後 Bot との会話も問題なく動作しています。
原因は謎ですが、ひとまずめでたし。 (所要時間: 1.5h)
2. Google Drive のファイル取得結果が配列じゃない問題
問題でもないんですが、ファイルを名前で検索するために以下のようなコードをかきました。
var fileList = DriveApp.searchFiles(`title contains "${value}"`);
とりあえず件数を console.log(fileList.length)
で出力させてみようとするも、結果は空です。
forEachつかってファイル名だけの配列つくるか と思ったものの、こちらは明確にエラーになりました。
どうやらArray classをextendしているわけではなさそうです。
そもそも fileList,.
と入力して出てくる候補が3つしかありません。
ということで、よく見るGoogle Drive を使ったGASのサンプルでは
while(fileList.hasNext()) { file = fileList.next(); //ここに何かの処理 }
となっているわけでした。
もう一個、無限ループではまった
while(fileList.hasNext()) { file = fileList.next(); //ここに何かの処理 }
このコードをちゃんと理解せずコピペしていたところ file = fileList.next();
を消して無限ループに入ってしまいました。
必ずfileListから次を取得して、while文の条件を更新してやらないといけないですね。
ということで、Google Drive を使ってファイルのリスト/フォルダーのリストを操作するときには以下はセットと思わないといけないようです。
while(fileList.hasNext()) { file = fileList.next(); //ここに何かの処理 }
whileで全件処理するので、ファイル数多くなるとスクリプト実行にかなり時間がかかる点にも注意が必要です。
以上、GAS で LINE Bot作った時の個人的はまりポイントでした。