0.はじめに
以前、こんな記事を書きました。
「フォームのデータを取得できませんでした。のエラーに対処した話」
内容としては、おそらくGoogle側の問題が原因で発生するエラー、
Exception: フォームのデータを取得できませんでした。しばらくしてからもう一度お試しください。
に対処する方法についてでした。
GASのフォーム送信時トリガーで回答情報を取得しようとする際に起こるエラーですね。
ただ、エラーを防止する方法は無く、
エラーが起きても後から再実行できる方法を提案するものでした。
記事の投稿から時間が経ち、私が採用しているコードも変わりました。
相変わらずエラーを防止する方法はありませんが、
上記の記事はいまだに結構アクセスがありますので、
最新版をお届けしようと思います。
1.コード
// フォーム送信時トリガー
function main(e) {
let datas = {status:false, msg:"初期値"};
//フォームデータ取得を20回トライする
for(let i = 1; i<=20; i++){
datas = getFormDatas(e);
if(datas.status) break;
Utilities.sleep(3000);
}
if(!datas.status){
//前回記事の方法やエラーメール送信などを書く
};
}
//フォームデータの取得
function getFormDatas(e){
try{
// 必要な処理をする
const formTitle = FormApp.getActiveForm().getTitle();
const itemresponses = e.response.getItemResponses();
const address = e.response.getRespondentEmail();
const responseId = e.response.getId();
return {status:true,formTitle:formTitle,itemresponses:itemresponses,address:address,category:category,responseId:responseId};
}
catch(er){
console.log(er);
return {status:false, msg:er.message};
}
}
2.簡易解説
フォーム回答を取得する部分について、getFormDatasという関数にしています。
これを、成功するまで20回を上限に実行しています。ごくシンプルですね。
高速でループしてもサーバーエラーが解消しない限り無意味なので、
気分的にループ毎に3秒のwaitを入れています。
このwaitに本当に意味があるかは分かりません!
3.検証結果
このコードを書いた当時、SeleniumでGoogleフォームを1,500回、回答してテストしました。
※seleniumとは、ブラウザを自動操作するツールです。pythonやC#で使えます。
エラーが出ない時期もありますが、出る時期に行いました。
結果、2回以上のループに入るケースが2割ほどありましたが、
20ループを超えてエラーを吐くケースは1%未満に留まりました。
4.ループ回数は何回が適切なのか
ループしすぎて処理がタイムアウトにならなければいいのではないでしょうか。
あまり気にせず適当に決めていいと思いますが、
エラーが出る時期は5ループとか10ループだと結構突破してくる印象があります。
5.最後に
いかがでしたでしょうか。
単に試行回数を増やすという強引な対処ですが、
ランダム性のあるこの手のエラーには1つの有効な手立てとなります。
ぜひ、前回記事と合わせて活用してみてください。