前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー