第三方 API

Google Ads 指令碼的一項強大功能,就是能夠與資料整合 及服務

本指南將說明下列概念,協助您將指令碼編寫為 連線至其他服務:

  • 提出 HTTP 要求:使用方式 UrlFetchApp可存取 以及外部 API
  • 驗證:我們會說明一些常見的驗證情況。
  • 剖析回應:如何處理傳回的 JSON 和 XML 資料。

我們也提供 數字的範例 說明這些概念的常見 API

使用 UrlFetchApp 擷取資料

UrlFetchApp 提供 與第三方 API 互動所需的核心功能。

以下範例顯示從中擷取天氣資料 OpenWeatherMap。我們選擇 OpenWeatherMap 相對簡單的授權配置和 API

提出要求

OpenWeatherMap 說明文件會指定 用來要求目前天氣的格式 如下所示:

http://api.openweathermap.org/data/2.5/weather?q=[location]&apikey=[apikey]

網址提供了第一個授權範例:apikey 參數是 且每個使用者的值也都不同這個金鑰是透過 申請

註冊後,可以使用金鑰發出要求,如下所示:

const location = 'London,uk';
const apikey = 'da.......................81'; // Replace with your API key
const currentWeatherUrl = `http://api.openweathermap.org/data/2.5/weather?q=${location}&apiKey=${apiKey}`;
const response = UrlFetchApp.fetch(currentWeatherUrl);
console.log(response.getContentText());

執行這段程式碼會產生一長串 JSON 字串 在 Google Ads 指令碼中寫入記錄視窗的文字。

下一步是將格式轉換成可在 指令碼

JSON 資料

許多 API 都會提供 JSON 格式的回應,也就是說 JavaScript 物件的序列化作業,例如物件、陣列與基本型別 能以字串表示及轉移

如要轉換 JSON 字串 (例如 OpenWeatherMap - 回到 JavaScript 物件,使用內建的 JSON.parse 方法。延續上述範例:

const json = response.getContentText();
const weatherData = JSON.parse(json);
console.log(weatherData.name);
//  "London"

JSON.parse 方法會將字串轉換為具有屬性的物件 name

詳情請參閱「剖析回應」一節 如何以不同格式的 API 回應

處理錯誤

使用第三方 API 時,錯誤處理是很重要的考量重點 因為第三方 API 經常變更 非預期的回應值,例如:

  • API 的網址或參數可能會在您不知情的情況下變更,
  • 您的 API 金鑰 (或其他使用者憑證) 可能會過期。
  • 回應的格式可能會變更,恕不另行通知。

HTTP 狀態碼

由於可能發生非預期的回應,因此您應檢查 HTTP 狀態碼。根據預設 如果發生 HTTP 錯誤代碼,UrlFetchApp 會擲回例外狀況。目的地: 變更此行為,您必須傳送選擇性參數,就像在 範例:

const options = {
  muteHttpExceptions: true
}
const response = UrlFetchApp.fetch(url, options);
// Any status code greater or equal to 400 is either a client or server error.
if (response.getResponseCode() >= 400) {
  // Error encountered, send an email alert to the developer
  sendFailureEmail();
}

回應結構

第三方 API 變更時,開發人員通常不會立即得知 可能影響指令碼執行的變更舉例來說,如果 name 屬性 OpenWeatherMap 範例傳回的 變更為 locationName,指令碼 就無法使用這項屬性

因此,要測試傳回的結構是否 名稱符合預期,例如:

const weatherData = JSON.parse(json);
if (weatherData && weatherData.name) {
  console.log('Location is : ' + name);
} else {
  console.log('Data not in expected format');
}

使用 UrlFetchApp 的 POST 資料

OpenWeatherMap 的入門範例 只擷取擷取的資料通常不會在遠端變更狀態的 API 呼叫 伺服器會使用 HTTP GET 方法。

GET 方法是 UrlFetchApp 的預設方法。不過,有一些 API 呼叫 (例如呼叫可傳送簡訊的服務) 需要使用其他方法 例如 POSTPUT

以下範例說明如何搭配 UrlFetchApp 使用 POST 呼叫 示範如何與 Slack 整合,協作訊息服務 應用程式,藉此傳送 Slack 訊息給 Slack 使用者和群組。

設定 Slack

本指南假設您已註冊 Slack 帳戶。

和上一個範例的 OpenWeatherMap 一樣,需要取得 符記,以便傳送訊息。Slack 提供專屬網址,可讓您 自動傳送訊息至您的團隊,這稱為「傳入 Webhook」

按一下滑鼠左鍵來設定連入 Webhook 新增連入 WebHooks 整合,並依照指示操作。 程序,應提供用於傳送訊息的網址。

發出 POST 要求

設定好連入 Webhook 後,只要提出 POST 要求, 在傳入的 options 參數中使用部分額外屬性 UrlFetchApp.fetch:

  • method:如前所述,預設為 GET,但此處會覆寫這個值,並 設為 POST
  • payload:這是要做為 POST 的一部分傳送至伺服器的資料 請求。在這個範例中,Slack 預期物件已序列化為 JSON 格式 如同 Slack 中 說明文件。在這種情況下, JSON.stringify 方法,並將 Content-Type 設為 application/json

      // Change the URL for the one issued to you from 'Setting up Slack'.
      const SLACK_URL = 'https://hooks.slack.com/services/AAAA/BBBB/CCCCCCCCCC';
      const slackMessage = {
        text: 'Hello, slack!'
      };
    
      const options = {
        method: 'POST',
        contentType: 'application/json',
        payload: JSON.stringify(slackMessage)
      };
      UrlFetchApp.fetch(SLACK_URL, options);
    

擴充 Slack 範例

以上範例顯示啟用傳入訊息至 Slack 的最低門檻。一個 擴充的範例說明瞭 建立並傳送廣告活動成效 檢舉 群組,以及一些格式設定和顯示選項。

收到的訊息

請參閱 Slack 的「訊息格式」一節 說明文件。

表單資料

以上範例說明如何使用 JSON 字串做為 payload 屬性 針對 POST 要求。

UrlFetchApp 會根據 payload 的格式採用不同的方法 建構 POST 要求:

  • payload 是字串時,系統會將字串引數做為 要求主體
  • payload 是物件時,例如值對應:

    {to: 'mail@example.com', subject:'Test', body:'Hello, World!'}
    

    鍵/值組合會轉換為表單資料:

    subject=Test&to=mail@example.com&body=Hello,+World!
    

    此外,要求的 Content-Type 標頭也設為 application/x-www-form-urlencoded

有些 API 需要在提交 POST 要求時使用表單資料,因此這個方法 從 JavaScript 物件自動轉換為資料格式

HTTP 基本驗證

HTTP 基本驗證 驗證屬於 也是最簡單的驗證形式,且由許多 API 使用。

只要將已編碼的使用者名稱和密碼附加到 每個要求中的 HTTP 標頭。

HTTP 基本驗證

建立要求

必須執行下列步驟才能產生已驗證要求:

  1. 建立通關密語時,使用 冒號,例如 username:password
  2. 使用 Base64 編碼通關密語;例如 username:password 會變為 dXNlcm5hbWU6cGFzc3dvcmQ=
  3. Authorization 標頭附加至要求,格式為 Authorization: Basic <encoded passphrase>

請參考下列程式碼片段,瞭解如何在 Google Ads Scripts 中完成這項作業:

const USERNAME = 'your_username';
const PASSWORD = 'your_password';
const API_URL = 'http://<place_api_url_here>';

const authHeader = 'Basic ' + Utilities.base64Encode(USERNAME + ':' + PASSWORD);
const options = {
  headers: {Authorization: authHeader}
}
// Include 'options' object in every request
const response = UrlFetchApp.fetch(API_URL, options);

基本驗證範例

程式碼範例 一節包含兩個範例,說明如何使用「HTTP 基本驗證」:

Plivo

Plivo 服務可用於傳送 透過 API 接收 SMS 訊息這個範例顯示 訊息。

  1. Plivo 註冊。
  2. 範例指令碼貼到 建立新的指令碼
  3. PLIVO_ACCOUNT_AUTHIDPLIVO_ACCOUNT_AUTHTOKEN 值替換為 管理資訊主頁的值。
  4. 輸入您在指令碼中所指定的電子郵件地址,以便我們發送以下通知: 發生錯誤。
  5. 如要使用 Plivo,你必須購買號碼或在試用期間新增號碼 讓他們使用服務帳戶新增沙箱編號 試用帳戶。
  6. 輸入寄件者和收件者中顯示的兩組號碼 號碼。
  7. 將指令碼中的 PLIVO_SRC_PHONE_NUMBER 更新為其中一個沙箱號碼 。其中應包含國際國家/地區代碼, 以 447777123456 表示英國的電話號碼。

Twilio

Twilio 是另一項服務,可用來傳送 透過 API 接收 SMS 訊息這個範例顯示 訊息。

  1. ���往 Twillio 註冊。
  2. 貼上範例指令碼 移至 Google Ads 的新指令碼中
  3. TWILIO_ACCOUNT_SIDTWILIO_ACCOUNT_AUTHTOKEN 值替換為 帳戶控制台頁面中顯示的各種價值。
  4. TWILIO_SRC_PHONE_NUMBER 替換為 資訊主頁,也就是在這個資訊主頁中 這個號碼。

OAuth 1.0

許多熱門服務都會使用 OAuth 進行驗證。OAuth 提供 變種版本和版本

另一方面,採用 HTTP 基本驗證時 只有一個使用者名稱和密碼,OAuth 允許第三方應用程式 透過該 API 專用的 第三方應用程式。此外,存取權範圍也會 專屬於該應用程式

如需 OAuth 1.0 的背景資訊,請參閱 OAuth 核心指南。 特別是 6.使用 OAuth 進行驗證。完整三足式 OAuth 1.0 的程序,流程如下:

  1. 應用程式 (「消費者」) 會取得要求權杖。
  2. 使用者授權要求憑證。
  3. 應用程式交換要求權杖,以取得存取權杖。
  4. 針對所有後續資源要求,存取符記會用在已簽署 請求。

針對第三方服務,在沒有使用者互動的情況下使用 OAuth 1.0 (例如 因為 Google Ads 指令碼需要) 步驟 1、2 和 3 都無法使用。 因此,某些服務會從設定發出存取權杖 控制台,讓應用程式能直接前往步驟 4。也就是 單足式 OAuth 1.0

OAuth1

Google Ads 指令碼中的 OAuth 1.0

對於 Google Ads 指令碼,每個指令碼通常會視為應用程式。 在服務的主控台/管理設定頁面中,通常會設定 執行以下作業:

  • 進行應用程式設定來代表指令碼。
  • 指定要擴充至指令碼的權限。
  • 取得用戶端金鑰、用戶端密鑰、存取權杖和存取密鑰以供使用 使用單足式 OAuth

OAuth 2.0

OAuth 2.0 是常用的 API 用來提供應用程式存取權 使用者資料。特定第三方服務授權的帳戶擁有者 允許特定應用程式存取使用者資料。 的優勢在於:

  • 不必與應用程式共用帳戶憑證。
  • 控制哪些應用程式能個別存取資料,並 程度。(例如,取得的存取權可能為唯讀,或僅授予 資料子集)

若要在 Google Ads 指令碼中使用已啟用 OAuth 2.0 的服務,您有以下幾項: 步驟:

指令碼外

授權 Google Ads Scripts 透過以下方式存取您的使用者資料: 第三方 API。在大多數情況下,您需要為 application 中。此應用程式 代表 Google Ads 指令碼

您可以指定 Google Ads 指令碼應用程式應具備的存取權 通常會獲派用戶端 ID這樣一來 OAuth 2 是用來控制應用程式能否存取 資料顯示方式,以及使用者能查看或探索哪些資料 修改。

加入腳本

使用遠端伺服器授權。視授權類型而定 一組不同的步驟 (稱為流程) 但最終都會產生存取權杖。 。

提出 API 要求。針對每個要求傳遞存取權杖

授權流程

每種授權類型及相關流程皆適用於不同的使用情境。適用對象 使用者參與互動式活動時,所用的流程不同 相比之下,應用程式必須在 使用者則不在廣告背景中

API 供應商會決定他們接受哪些授權類型,本指南也會引導您 說明使用者如何著手整合 API

導入作業

針對所有不同的 OAuth 流程,目標都是取得 隨後讓工作階段的其餘部分能驗證要求

範例程式庫 說明如何驗證各個不同的流程類型。每個 方法會傳回一個物件,該物件可取得並儲存存取權杖,且 用於驗證要求

一般使用模式如下:

// Authenticate using chosen flow type
const urlFetchObj = OAuth2.<flow method>(args);
// Make request(s) using obtained object.
const response1 = urlFetchObj.fetch(url1);
const response2 = urlFetchObj.fetch(url2, options);

授予用戶端憑證

用戶端憑證授權是 是一種更簡單的 OAuth2 流程之一,在此流程中,應用程式會使用 專屬的 ID 和密鑰。 限時存取的存取權杖

用戶端憑證

// Access token is obtained and cached.
const authUrlFetch = OAuth2.withClientCredentials(
    tokenUrl, clientId, clientSecret, optionalScope));
// Use access token in each request
const response = authUrlFetch.fetch(url);
// ... use response

重新整理授予權杖

更新憑證與授予用戶端憑證類似,跟 向伺服器發出簡單的要求時,系統會傳回可用於伺服器的存取權杖 工作階段。

重新整理權杖

取得更新權杖

與更新權杖授權的差異是 用戶端憑證授權所需的資訊來自應用程式設定 (例如在服務的控制台中),系統會授予更新權杖。 且包含授權碼等較為複雜的流程 授予,因此需要使用者 互動:

授權碼

使用 OAuth Playground 取得更新權杖

OAuth2 Playground 提供可讓使用者使用的 UI 來逐步授予授權代碼,以取得更新權杖。

你可以使用右上角的設定按鈕定義所有參數 ,包括:

  • 授權端點:做為授權流程的起點。
  • 權杖端點:與更新權杖搭配使用,以取得存取權杖。
  • 用戶端 ID 和密鑰:應用程式的憑證。

OAuth 測試工具

使用指令碼取得更新權杖

如要完成上述流程,您可以使用以指令碼為基礎的替代方案。 更新權杖 圖像生成 樣本。

更新權杖使用方式

執行初始授權後,服務即可發出重新整理 權杖,其使用方式類似於用戶端憑證流程。 以下提供兩個範例:

const authUrlFetch = OAuth2.withRefreshToken(tokenUrl, clientId, clientSecret,
    refreshToken, optionalScope);
const response = authUrlFetch.fetch(url);
// ... use response

Search Ads 360 範例

Search Ads 360 是可與更新憑證搭配使用的 API 範例。 在這個範例中,指令碼會產生並傳回 報表。請參閱 Search Ads 360 360 API 參考資料:其他操作的完整詳情 可以對各種指令執行動作

建立指令碼
  1. API 控制台中建立新專案, 並取得用戶端 ID、用戶端密鑰和更新憑證,方法請參閱 程序, 確認您已啟用 DoubleClick Search API。
  2. 貼上範例 轉換為 新指令碼。
  3. 貼上OAuth2 範例 資源庫 程式碼清單。
  4. 修改指令碼,加入正確的用戶端 ID、用戶端密鑰或 並更新權杖

Apps Script Execution API 範例

這個範例說明如何透過應用程式 Script Execution API。這麼做可讓 Apps Script 可用在 Google Ads 指令碼中呼叫

建立 Apps Script 指令碼

建立新的指令碼。下列範例將 10 個來自雲端硬碟的檔案:

function listFiles() {
  const limit = 10;
  const files = [];
  const fileIterator = DriveApp.getFiles();
  while (fileIterator.hasNext() && limit) {
    files.push(fileIterator.next().getName());
    limit--;
  }
  return files;
}
設定要執行的 Apps Script
  1. 儲存指令碼。
  2. 按一下「資源」>Cloud Platform 專案
  3. 按一下專案名稱,前往 API 控制台。
  4. 前往 API 與服務
  5. 啟用適當的 API (在這種情況下,請啟用雲端硬碟 API應用程式 指令碼執行 API
  6. 透過選單的「Credentials」(憑證) 項目建立 OAuth 憑證。
  7. 返回指令碼,依序前往 [發布] > [發布待執行] 發布指令碼 以 API 執行檔的形式部署
建立 Google Ads 指令碼
  1. 貼上範例 指令碼轉換為 建立新的指令碼
  2. 此外,請貼上OAuth2 範例 資源庫 程式碼清單。
  3. 修改指令碼,加入正確的用戶端 ID、用戶端密鑰或 並更新權杖

服務帳戶

除了上述授權類型之外,「service」的概念是 service 帳戶

與上述不同之處在於不會用來存取使用者 資料:驗證完成後,服務帳戶會代表服務帳戶提出要求 而非專案擁有者。舉例來說 服務帳戶是透過 Drive API 建立檔案 則屬於該服務帳戶,預設使用者無法存取 專案擁有者

Google Natural Language API 範例

Natural Language API 提供 情緒 分析實體 分析文字

這個範例說明計算 情緒 廣告標題或說明。這項指標可讓您測量 訊息的正面程度及訊息規模:這樣比較好 我們販售蛋糕倫敦最優質的蛋糕店。歡迎立即選購!

設定指令碼
  1. API 控制台中建立新專案
  2. 啟用「Natural Language (自然語言)」 API
  3. 啟用專案的計費功能。
  4. 建立 Service 帳戶。 下載憑證 JSON 檔案。
  5. 貼上範例 移至新指令碼 指令碼。
  6. 此外,請貼上OAuth2 範例 資源庫 程式碼清單。
  7. 替換必要的值:
    • serviceAccount:例如服務帳戶的電子郵件地址 xxxxx@yyyy.iam.gserviceaccount.com
    • key:建立 Service 時下載的 JSON 檔案中的金鑰 。開始時間:-----BEGIN PRIVATE KEY...,結束時間:...END PRIVATE KEY-----\n

API 回應

API 可透過多種格式傳回資料。其中最值得注意的是 XML 以及 JSON

JSON

JSON 通常比 XML 更簡單 回應的格式。不過,還是有可能出現一些問題。

回應驗證

您從對 API 的呼叫取得成功的回應後, 下一步是使用 JSON.parse 將 JSON 字串轉換為 JavaScript 物件。此時,系統就會放心處理 失敗

const json = response.getContentText();
try {
  const data = JSON.parse(json);
  return data;
} catch(e) {
  // Parsing of JSON failed - handle error.
}

此外,如果 API 不在您的控制下,請考慮 回應可能會改變,且屬性也可能不再存在:

// Less good approach
// Assumes JSON was in form {"queryResponse": ...} when parsed.
const answer = data.queryResponse;

// Better approach
if (data && data.queryResponse) {
  const answer = data.queryResponse;
} else {
  // Format of API response has changed - alert developer or handle accordingly
}

XML

驗證

XML 仍是建構 API 的熱門格式。API 呼叫的回應 可以使用 XmlService parse 方法:

const responseText = response.getContentText();
try {
  const document = XmlService.parse(responseText);
} catch(e) {
  // Error in XML representation - handle accordingly.
}

XmlService.parse 可偵測 XML 中的錯誤並擲回例外狀況 這樣一來,就無法根據 結構定義。

根元素

假設 XML 文件剖析成功,系統就會取得根元素 方法是使用 getRootElement() 方法:

const document = XmlService.parse(responseText);
const rootElement = document.getRootElement();

命名空間

在下列範例中,使用 Sportradar API 是用於取得所選球賽的足球比賽結果。XML 回應會 格式如下:

<schedule xmlns="http://feed.elasticstats.com/schema/soccer/sr/v2/matches-schedule.xsd">
  <matches>
     ...
  </matches>
</schedule>

請注意命名空間在根元素中的指定方式。因此 執行以下作業:

  • 從文件中擷取命名空間屬性。
  • 掃遍及存取子元素時,請使用這個命名空間。

以下範例說明如何存取上述 <matches> 元素 文件文字片段:

const document = XmlService.parse(xmlText);
const scheduleElement = document.getRootElement();
// The namespace is required for accessing child elements in the schema.
const namespace = scheduleElement.getNamespace();
const matchesElement = scheduleElement.getChild('matches', namespace);

取得值

假設足球賽程的範例如下:

<match status="..." category="..." ... >
  ...
</match>

可擷取屬性,例如:

const status = matchElement.getAttribute('status').getValue();

使用 getText() 讀取元素包含的文字,但這些文字 如果元素有多個文字子項,這些元素會串連在一起。您可以考慮使用 在多個子項中使用 getChildren() 並疊代處理每個子項 可能是子項文字

Sportradar 範例

本完整運動賽事 範例 擷取足球比賽的詳細資料,特別是英格蘭足球超級聯賽 比對。Soccer API 是 Sportradar 提供的眾多運動動態消息之一。

設定 Sportradar 帳戶
  1. 前往 Sportradar 開發人員網站
  2. 註冊試用帳戶
  3. 註冊成功,請登入您的帳戶。
  4. 登入後,前往 MyAccount

Sportradar 將各種運動分成不同的 API。舉例來說, 可能會購買 Soccer API 的存取權,但可能無法購買 Tennis API。每項 您建立的應用程式可以連結多項運動 不同的金鑰

  1. 按一下「應用程式」下方的「建立新的應用程式」。授予應用程式 名稱和說明,並略過網站欄位。
  2. 僅選取「核發新的金鑰給歐洲足球賽第 2 版」
  3. 按一下「Register Application」

成功之後,您應該會看到內含新 API 金鑰的網頁。

  1. 貼上範例指令碼 移至 Google Ads 的新指令碼中
  2. 將清單上的 API 金鑰換成上述取得的金鑰,然後編輯 電子郵件地址欄位。

疑難排解

使用第三方 API 時,可能會因為許多原因而發生錯誤, 範例:

  • 用戶端以 API 未預期的格式向伺服器發出要求。
  • 用戶端預期的回應格式與遇到的格式不同。
  • 用戶端使用無效的權杖或金鑰,或是保留做為預留位置的值。
  • 用戶端達到用量限制。
  • 用戶端提供的參數無效。

在這些情況下或其他情況下,建議你踏出第一步,找出原因 是檢查導致錯誤回應的詳情。

剖析回應

根據預設,任何傳回錯誤的回應 (狀態 400 以上的程式碼) 由 Google Ads 指令碼引擎擲回。

以免發生這種行為,並允許錯誤和錯誤訊息 已檢查完畢,請將選用參數的 muteHttpExceptions 屬性設為 UrlFetchApp.fetch。例如:

const params = {
  muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, params);
if (response.getResponseCode() >= 400) {
  // ... inspect error details...
}

常見的狀態碼

  • 200 OK 表示成功。如果回應中沒有 請考量以下事項:

    • 有些 API 允許指定 相關單位會如何運用資料,並讓他們覺得自己 獲得充分告知,且能夠針對該使用方式表示同意詳情請參閱 API 說明文件。
    • API 可能會有多個資源可以呼叫。請參閱 判斷其他資源是否 並且傳回您需要的資料。
    • API 可能會在程式碼編寫後變更。請參閱 或開��人員要求進一步說明
  • 400 Bad Request 通常表示 傳送至伺服器的要求格式或結構檢查 並與 API 規格進行比較 期望。詳情請參閱「檢查要求」一節。 瞭解如何檢查要求

  • 401 Unauthorized 通常表示呼叫 API ���未提供或 ������執行���權���業

    • 如果 API 使用基本授權,請確認 Authorization 標頭 要求中定義和提供。
    • 如果 API 使用 OAuth 2.0,請確認已取得存取權杖不記名權杖的形式提供。
    • 如果是其他授權變化版本,請確定 取得憑證時所需的憑證。
  • 403 Forbidden 表示使用者沒有存取資源的權限 例如文字、圖像和網路

    • 確認已授予使用者必要權限,例如: 透過檔案式要求授予使用者檔案存取權。
  • 404 Not Found 表示要求的資源不存在。

    • 請確認 API 端點使用的網址正確無誤。
    • 如果要擷取資源,請確認參照的資源是否存在 (例如,如果檔案適用於檔案型 API)。

檢查要求

如果 API 回應指出要求有誤,檢查要求會相當實用 而轉換為 400 狀態碼如要協助檢查要求,請UrlFetchApp 具有 fetch() 方法的隨附方法 getRequest()

這個方法不會傳送要求至伺服器,而會建構要求 並傳回該值可能的內容。這可讓使用者 檢查要求的元素,確保要求看起來正確無誤。

例如,如果要求中的表單資料包含許多串連的字串, 錯誤可能就是您在為了產生該表單而建立的函式中 資料。最簡單的方式:

const request = UrlFetchApp.getRequest(url, params);
console.log(request);
// Now make the fetch:
const response = UrlFetchApp.fetch(url, params);
// ...

可讓您檢查要求的元素。

記錄要求與回應

為協助檢查要求和回應的整個程序, 第三方 API,以下輔助函式可以做為置入式 取代 UrlFetchApp.fetch(),以便記錄要求和回應。

  1. 將程式碼中所��� UrlFetchApp.fetch() 的執行個體替換為 logUrlFetch()

  2. 將下列函式新增至指令碼結尾,

    function logUrlFetch(url, opt_params) {
      const params = opt_params || {};
      params.muteHttpExceptions = true;
      const request = UrlFetchApp.getRequest(url, params);
      console.log('Request:       >>> ' + JSON.stringify(request));
      const response = UrlFetchApp.fetch(url, params);
      console.log('Response Code: <<< ' + response.getResponseCode());
      console.log('Response text: <<< ' + response.getContentText());
      if (response.getResponseCode() >= 400) {
        throw Error('Error in response: ' + response);
      }
      return response;
    }
    

執行指令碼時,系統會將所有要求和回應的詳細資料記錄下來, 也���容易偵錯