質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

5202閲覧

エラーが出た時にもう一度関数を実行する処理を施したいです。

Kazuki74

総合スコア8

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/04/12 03:07

編集2018/04/12 03:13

前提・実現したいこと

GAS(javascript)を用いて、FacebookのAPIからスプレッドシートにデータを引っ張って来る処理を実装しようとしています。
実装には成功したのですが、時々GETリクエストでエラーが出てしまいます。
トリガーを設定し毎日定時に確実に処理を実行したいため、エラーが出た時にもう一度関数を実行する処理を施したいです。
下記ソースコード下部のkpiFunctionをエラー時に再実行したいです。

発生している問題・エラーメッセージ

下記ソースコードの"UrlFetchApp.fetch"で引っかかります。3か所ほどありますが毎回同じ場所でエラーが出るわけではありません。

該当のソースコード

Google Apps Script

var ACCESS_TOKEN = ""; function getReportByHttpRequest(today, fields, campaign_id) { var payload = { "time_range" : "{'since':'" + today + "','until':'" + today + "'}", "fields" : fields, "access_token" : ACCESS_TOKEN }; var options = { "method" : "POST", "payload" : payload }; return UrlFetchApp.fetch("https://graph.facebook.com/v2.12/" + CL_CAMPAIGN_ID + "/insights?access_token=" + ACCESS_TOKEN, options); } function getProgressByHttpRequest(report_run_id){ var url = "https://graph.facebook.com/v2.12/" + report_run_id + "?access_token=" + ACCESS_TOKEN; var response = UrlFetchApp.fetch(url); var json = JSON.parse(response); return json["async_percent_completion"]; } function getFacebookReport(response) { var json = JSON.parse(response); var report_run_id = json["report_run_id"]; Logger.log(report_run_id); var progress_percentage = getProgressByHttpRequest(report_run_id); Logger.log(progress_percentage); while (progress_percentage < 100) { Utilities.sleep(10000); progress_percentage = getProgressByHttpRequest(report_run_id); Logger.log(progress_percentage); } var url = "https://graph.facebook.com/v2.12/" + report_run_id + "/insights?access_token=" + ACCESS_TOKEN; var response = UrlFetchApp.fetch(url); json = JSON.parse(response); return json; } // キャンペーンID var CL_CAMPAIGN_ID = "XXXXXXXXXXXXXXXXXX"; // スプレッドシート取得  var spreadsheet = SpreadsheetApp.openById('XXXXXXXXXXXX'); // スプレッドシート参照 var cl_sheet = spreadsheet.getSheetByName('CL'); // シート上のFacebookアクセストークンと日付を取得 ACCESS_TOKEN = cl_sheet.getRange("A1").getValue(); function kpifunctionCLTest(){ var value_total_date = cl_sheet.getRange("A3:A356").getValues(); Logger.log(value_total_date); // 昨日の日付取得 var yesterday = new Date(); yesterday.setDate(yesterday.getDate()-1); yesterday = Utilities.formatDate(new Date(yesterday), "JST", "yyyy-MM-dd"); // 出力先の行を取得 var target_row; var date; for(i = 1; i < 365; i++){ date = Utilities.formatDate(new Date(value_total_date[i]), "JST", "yyyy-MM-dd"); if(yesterday == date){ target_row = i + 3; break; } } // CL広告のレポートを取得し、シートに出力 var cl_conversion = getReportByHttpRequest(yesterday, "date_start,date_stop,campaign_id,campaign_name,reach,spend,clicks,unique_clicks,ctr,cpm,actions,impressions", CL_CAMPAIGN_ID); if(cl_conversion.getResponseCode() != 200) { Logger.log("レポートを取得できませんでした"); } var cl_report = getFacebookReport(cl_conversion); if(cl_conversion["data"] != ""){ cl_sheet.getRange("B" + target_row).setValue(cl_report["data"][0]["date_stop"]); cl_sheet.getRange("C" + target_row).setValue(cl_report["data"][0]["clicks"]); cl_sheet.getRange("D" + target_row).setValue(cl_report["data"][0]["impressions"]); cl_sheet.getRange("E" + target_row).setValue(cl_report["data"][0]["spend"]); cl_sheet.getRange("F" + target_row).setValue(cl_report["data"][0]["cpm"]); cl_sheet.getRange("G" + target_row).setValue(cl_report["data"][0]["actions"][3]["value"]); cl_sheet.getRange("H" + target_row).setValue(cl_report["data"][0]["actions"][1]["value"]); } else { Logger.log("広告レポートの値がありません"); } }

試したこと

tryとcatchを使おうとしましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.tada

2018/04/12 03:10

コードはコードブロック(```〜```で囲う)で書いていただけますか。
k.tada

2018/04/12 03:12

ダブルクオーテーション(")ではなく、バッククォート(`)でお願いします。
Kazuki74

2018/04/12 03:13

初心者ですみません、対応いたしました。
guest

回答2

0

ベストアンサー

GASで以前にこんな感じで書いてました。
このコードだとリトライして失敗ならあきらめますが、繰り返すように書き直せばいいかと思います。

js

1function check_server(url){ 2 var code = check_server_retry(url); 3 if(code != 200){ 4 Utilities.sleep(10000); 5 return check_server_retry(url); 6 } else { 7 return code; 8 } 9} 10 11function check_server_retry(url){ 12 try{ 13 var res = UrlFetchApp.fetch(url); 14 return res.getResponseCode(); 15 } catch(e){ 16 return 999; 17 } 18}

元にしたコードはこちらです。
Google Apps Script でWEB死活監視(複数URL編) | Dozens Members' Blog

投稿2018/04/12 03:31

編集2018/04/12 03:33
Lhankor_Mhy

総合スコア35865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーがでている処理を再要求したらまたエラーになる可能性はないのでしょうか?
たとえばなんらかの障害によりエラーを返しているとして
そこに何度も要求がくるとなると、それは攻撃だとみなされると思います

sample

雑ですがリトライ処理の考え方だけ

javascript

1console.log("start"); 2var retry_count=1; 3while(retry_count<10){ 4 try{ 5 dummy;//カウンタが5回まわるまでエラーになりつづける 6 console.log("success"); 7 break; 8 }catch(e){ 9 console.log(retry_count+":"+e); 10 if(retry_count>=5) dummy=1; 11 } 12 retry_count++; 13} 14console.log("end");

投稿2018/04/12 03:17

編集2018/04/12 04:11
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazuki74

2018/04/12 03:21 編集

20回実行したらだいたい1回エラーになります。 連続してエラーになることは今のところ無いです。
yambejp

2018/04/12 04:14

同期処理ならwhleでリトライすればいいかもしれません tryで拾えないならエラーではなく結果のtrue/falseで返るかもしれません その場合はbooleanを元にthrowしてあげてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問