本文概述伺服器端標記的 API。
addEventCallback
註冊回呼函式,系統會在事件結束時叫用該函式。當事件的所有標記都已執行時,系統會叫用回呼。回呼會傳遞兩個值:叫用函式的容器 ID,以及包含事件相關資訊的物件。
在代碼中使用這個 API 時,會與目前的事件建立關聯。在用戶端中使用這個 API 時,必須使用 runContainer API 的 bindToEvent 函式,將 API 繫結至特定事件。詳情請參閱範例。
語法
const addEventCallback = require('addEventCallback');
addEventCallback((containerId, eventData) => {
// Take some action based on the event data.
});
參數
| 參數 | 類型 | 說明 |
|---|---|---|
callback |
function | 活動結束時要叫用的函式。 |
eventData 物件包含下列資料:
| 鍵名 | 類型 | 說明 |
|---|---|---|
tags |
陣列 |
標記資料物件的陣列。事件期間觸發的每個代碼都會在這個陣列中顯示一個項目。代碼資料物件包含代碼 ID (id)、執行狀態 (status) 和執行時間 (executionTime)。代碼資料也會包含代碼上設定的其他代碼中繼資料。 |
在用戶端中:
const addEventCallback = require('addEventCallback');
const claimRequest = require('claimRequest');
const extractEventsFromMpv1 = require('extractEventsFromMpv1');
const logToConsole = require('logToConsole');
const returnResponse = require('returnResponse');
const runContainer = require('runContainer');
claimRequest();
const events = extractEventsFromMpv1();
let eventsCompleted = 0;
events.forEach((evt, i) => {
runContainer(evt, /* onComplete= */ (bindToEvent) => {
bindToEvent(addEventCallback)((containerId, eventData) => {
logToConsole('Event Number: ' + i);
eventData.tags.forEach((tag) => {
logToConsole('Tag ID: ' + tag.id);
logToConsole('Tag Status: ' + tag.status);
logToConsole('Tag Execution Time: ' + tag.executionTime);
});
});
if (events.length === ++eventsCompleted) {
returnResponse();
}
});
});
在代碼中:
const addEventCallback = require('addEventCallback');
addEventCallback((containerId, eventData) => {
// This will be called at the end of the current event.
});
相關聯的權限
callLater
排定非同步呼叫函式。目前的程式碼傳回後,系統就會呼叫該函式。這相當於 setTimeout(<function>, 0)。
範例
const callLater = require('callLater');
const logToConsole = require('logToConsole');
callLater(() => {
logToConsole('Logged asynchronously');
});
語法
callLater(function)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
function |
function | 要呼叫的函式。 |
相關聯的權限
無。
claimRequest
在用戶端使用這個 API 聲明要求。認領要求後,容器就不會執行其他用戶端。
如果在代碼或變數中呼叫此 API,系統會擲回例外狀況。如果在用戶端傳回後呼叫這個 API (例如在非同步回呼中呼叫,如 callLater 或 runContainer onComplete 函式),就會擲回例外狀況。
用戶端應先使用這個 API 聲明要求,再呼叫 runContainer API。
範例
const claimRequest = require('claimRequest');
claimRequest();
語法
claimRequest();
相關聯的權限
無。
computeEffectiveTldPlusOne
傳回指定網域或網址的有效頂層網域 + 1 (eTLD+1)。 系統會根據公開字尾清單規則評估網域,計算出 eTLD+1。eTLD+1 通常是可設定 Cookie 的最高層級網域。
如果引數為空值或未定義,則會傳回未變更的引數值。否則引數會強制轉換為字串。如果引數不是有效的網域或網址,則會傳回空白字串。如果伺服器無法擷取公開尾碼清單,則會原封不動地傳回引數值。
範例
const computeEffectiveTldPlusOne = require('computeEffectiveTldPlusOne');
// Returns 'example.co.uk'
computeEffectiveTldPlusOne('analytics.example.co.uk');
// Returns 'example.co.uk'
computeEffectiveTldPlusOne('https://analytics.example.co.uk/path');
語法
computeEffectiveTldPlusOne(domainOrUrl);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
domainOrUrl |
string | 要計算 eTLD+1 的網域或網址。 |
相關聯的權限
無。
createRegex
建立新的 regex 執行個體,並以物件包裝後傳回。您無法直接存取規則運算式。不過,您可以將其傳遞至 testRegex API、String.replace()、String.match() 和 String.search()。
如果正規運算式無效,或伺服器無法使用 Re2,則傳回 null。
這個 API 使用 Re2 實作。伺服器 Docker 映像檔必須為 2.0.0 以上版本。
範例
const createRegex = require('createRegex');
const domainRegex = createRegex('\\w+\\.com', 'i');
// Returns '/foobar'
'example.com/foobar'.replace(domainRegex, '');
語法
createRegex(pattern, flags);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
pattern |
string | 規則運算式的文字。 |
flags |
string | 選用字串,內含要建立的 regex 的旗標。 支援 `g` (全域) 和 `i` (不區分大小寫)。系統會忽略所有其他字元。 |
相關聯的權限
無。
最低映像檔版本
decodeUri
解碼所提供 URI 中的任何編碼字元。傳回代表已解碼 URI 的字串。如果輸入內容無效,則傳回 undefined。
範例
const decodeUri = require('decodeUri');
const decodedUrl = decodeUri(data.encodedUrl);
if (decodedUrl) {
// ...
}
語法
decodeUri(encoded_uri);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
encoded_uri |
string |
已由 encodeUri() 或其他方式編碼的 URI。 |
相關聯的權限
無。
decodeUriComponent
解碼所提供 URI 元件中的任何編碼字元。傳回代表已解碼 URI 元件的字串。如果輸入無效,則傳回 undefined。
範例
const decodeUriComponent = require('decodeUriComponent');
const decodedQuery = decodeUriComponent(data.query);
if (decodedQuery) {
// ...
}
語法
decodeUriComponent(encoded_uri_component);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
encoded_uri_component |
string |
已由 encodeUriComponent() 或其他方式編碼的 URI 元件。 |
相關聯的權限
無。
encodeUri
傳回已編碼的統一資源識別碼 (URI),方法是逸出特殊字元。傳回代表所提供字串的 字串,該字串已編碼為 URI。
範例
const encodeUri = require('encodeUri');
const sendHttpGet = require('sendHttpGet');
sendHttpGet('https://www.example.com/' + encodeUri(pathInput));
語法
encodeUri(uri);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
uri |
string | 完整 URI。 |
相關聯的權限
無。
encodeUriComponent
傳回已編碼的統一資源識別碼 (URI),方法是逸出特殊字元。傳回代表所提供字串的 字串,該字串已編碼為 URI。
範例
const encodeUriComponent = require('encodeUriComponent');
const sendHttpGet = require('sendHttpGet');
sendHttpGet('https://www.example.com/?' + encodeUriComponent(queryInput));
語法
encodeUriComponent(str);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
str |
string | URI 的元件。 |
相關聯的權限
無。
extractEventsFromMpv1
將傳入的 Measurement Protocol V1 要求轉換為統一結構定義格式的事件清單。傳回擷取的事件清單。如果要求格式不正確,系統會擲回錯誤。
範例
const extractEventsFromMpv1 = require('extractEventsFromMpv1');
const isRequestMpv1 = require('isRequestMpv1');
if (isRequestMpv1()) {
const events = extractEventsFromMpv1();
for (let i = 0; i < events.length; ++i) {
const event = events[i];
// Process event.
}
}
語法
extractEventsFromMpv1();
相關聯的權限
需要 read_request 權限。權限必須設定為允許存取至少下列項目:
bodyquery parameters
extractEventsFromMpv2
將傳入的 Measurement Protocol V2 要求轉換為統一結構定義格式的事件清單。傳回擷取的事件清單。如果要求格式不正確,系統會擲回錯誤。
範例
const extractEventsFromMpv2 = require('extractEventsFromMpv2');
const isRequestMpv2 = require('isRequestMpv2');
if (isRequestMpv2()) {
const events = extractEventsFromMpv2();
for (let i = 0; i < events.length; ++i) {
const event = events[i];
// Process event.
}
}
語法
extractEventsFromMpv2();
相關聯的權限
需要 read_request 權限。權限必須設定為允許存取至少下列項目:
bodyquery parameters
fromBase64
解碼 Base64 編碼的字串。如果輸入內容無效,就會傳回 undefined。
語法
fromBase64(base64EncodedString);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
base64EncodedString |
string | Base64 編碼字串。 |
範例
const fromBase64 = require('fromBase64');
const greeting = fromBase64('aGVsbG8=');
if (greeting === 'hello') {
// ...
}
相關聯的權限
無。
generateRandom
傳回指定範圍內的隨機數字 (整數)。
範例
const generateRandom = require('generateRandom');
const randomValue = generateRandom(0, 10000000);
語法
generateRandom(min, max);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
min |
number | 傳回整數的最小可能值 (含)。 |
max |
number | 傳回整數的最大可能值 (含)。 |
相關聯的權限
無。
getAllEventData
傳回事件資料副本。
語法
getAllEventData();
相關聯的權限
getClientName
傳回包含目前用戶端名稱的字串。
語法
getClientName();
相關聯的權限
getContainerVersion
傳回包含目前容器相關資料的物件。傳回的物件包含下列欄位:
{
containerId: string,
debugMode: boolean,
environmentName: string,
environmentMode: boolean,
previewMode: boolean,
version: string,
}
範例
const getContainerVersion = require('getContainerVersion');
const containerVersion = getContainerVersion();
const containerId = containerVersion['containerId'];
const isDebug = containerVersion['debugMode'];
語法
getContainerVersion();
相關聯的權限
getCookieValues
傳回陣列,其中包含所有具有指定名稱的 Cookie 值。
範例
const getCookieValues = require('getCookieValues');
const lastVisit = getCookieValues('lastVisit')[0];
if (lastVisit) {
// ...
}
語法
getCookieValues(name[, noDecode]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
name |
string | Cookie 名稱。 |
noDecode |
boolean |
如果為 true,系統不會先解碼 Cookie 值,再傳回值。這個變數預設為 false。
|
相關聯的權限
getEventData
傳回事件資料中指定路徑的值副本。如果沒有事件資料,或指定路徑沒有值,則傳回 undefined。
範例
const getEventData = require('getEventData');
const campaignId = getEventData('campaign.id');
const itemId = getEventData('items.0.id');
const referrer = getEventData('page_referrer');
參數
| 參數 | 類型 | 說明 |
|---|---|---|
keyPath |
any |
金鑰路徑,其中路徑元件以半形句號分隔。路徑元件可以是物件中的鍵或陣列中的索引。如果 keyPath 不是字串,系統會強制轉換為字串。 |
語法
getEventData(keyPath);
相關聯的權限
getGoogleAuth
傳回授權物件,與 sendHttpGet 或 sendHttpRequest 搭配使用時,會包含 Google Cloud API 的授權標頭。這項 API 會使用應用程式預設憑證,自動從伺服器環境尋找憑證。
範例
const getGoogleAuth = require('getGoogleAuth');
const logToConsole = require('logToConsole');
const sendHttpGet = require('sendHttpGet');
const auth = getGoogleAuth({
scopes: ['https://www.googleapis.com/auth/datastore']
});
sendHttpGet(
'https://firestore.googleapis.com/v1/projects/my-project/databases/(default)/documents/collection/document',
{authorization: auth}
).then((result) => {
if (result.statusCode >= 200 && result.statusCode < 300) {
logToConsole('Result: ' + result.body);
data.gtmOnSuccess();
} else {
data.gtmOnFailure();
}
});
語法
getGoogleAuth(scopes);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
scopes
|
陣列 | 要要求存取權的 OAuth 2.0 Google API 範圍陣列。 |
相關聯的權限
需要 use_google_credentials 權限。權限必須設定一或多個允許的範圍。
getGoogleScript
從預先決定的 Google 指令碼集擷取資源,並傳回包含指令碼和相關聯快取中繼資料的Promise。
這項 Promise 會解析為包含兩個鍵的物件:script 和 metadata。如果要求失敗,Promise 會拒絕並傳回 reason 鍵。
metadata 物件會根據資源回應標頭包含下列快取中繼資料;只有在資源回應中出現對應標頭時,才會顯示各個欄位。
{
'cache-control': string,
'expires': string,
'last-modified': string,
}
範例
const getGoogleScript = require('getGoogleScript');
getGoogleScript('ANALYTICS').then((result) => {
// Operate on result.script and result.metadata here.
});
語法
getGoogleScript(script[, options]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
script |
string |
指令碼名稱。支援的指令碼為 'ANALYTICS'、'GTAG' 和 'GTM'。'ANALYTICS'
選項會從 https://www.google-analytics.com/analytics.js 擷取 Google Analytics 指令碼。「The」 'GTAG'選項會從 https://www.googletagmanager.com/gtag/js 擷取全域網站代碼 (gtag.js) 指令碼。「 'GTM'」選項會從 https://www.googletagmanager.com/gtm.js 擷取 Google 代碼管理工具指令碼。
|
options |
物體 | 選用要求選項。詳情請參閱下方的支援選項。 |
選項
| 選項 | 類型 | 說明 |
|---|---|---|
id |
string |
適用於 'GTAG' (使用 gtag 評估 ID) 和 'GTM' (使用網站容器 ID,例如 GTM-XXXX)。
|
debug |
any | 如果是真值,系統會要求並傳回評估指令碼的偵錯版本。 |
timeout |
number |
要求逾時時間 (毫秒),系統會忽略非正值。如果要求逾時,系統會使用指令碼值的 undefined 和中繼資料物件的 {} 叫用回呼。
|
系統會忽略無法辨識的選項鍵。
相關聯的權限
需要 send_http 權限。權限必須設定為允許存取至少下列項目:
- 允許 Google 網域
getRemoteAddress
讀取 Forwarded 和 X-Forwarded-For 等要求標頭,傳回要求來源 IP 位址的 字串表示法,例如 IPv4 的 12.345.67.890 或 IPv6 的 2001:0db8:85a3:0:0:8a2e:0370:7334。注意:這項 API 會盡力探索原始 IP,但無法保證結果準確無誤。
語法
getRemoteAddress();
相關聯的權限
需要 read_request 權限。權限必須設定為允許存取至少下列項目:
- 標頭
Forwarded和X-Forwarded-For - 遠端 IP 位址
getRequestBody
如果有的話,會以 string 形式傳回要求主體,否則會傳回 undefined。
語法
getRequestBody();
相關聯的權限
getRequestHeader
傳回具名要求標頭的值 (如有),做為 string,否則傳回 undefined。如果標題重複,傳回的值會以 ', ' 連結。
範例
const getRequestHeader = require('getRequestHeader');
const host = getRequestHeader('host');
語法
getRequestHeader(headerName);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
headerName |
string | 標頭名稱。這個值不區分大小寫。 |
相關聯的權限
getRequestMethod
以字串形式傳回要求方法,例如 'GET' 或 'POST'。
範例
const getRequestMethod = require('getRequestMethod');
if (getRequestMethod() === 'POST') {
// Handle the POST request here.
}
語法
getRequestMethod();
相關聯的權限
無。
getRequestPath
傳回不含查詢字串的要求路徑。舉例來說,如果網址為 '/foo?id=123',則會傳回 '/foo'。系統會自動從路徑中移除伺服器容器網址前置字串。舉例來說,如果伺服器容器網址為 https://example.com/analytics,且要求路徑為 '/analytics/foo',則會傳回 '/foo'。
範例
const getRequestPath = require('getRequestPath');
const requestPath = getRequestPath();
if (requestPath === '/') {
// Handle a request for the root path.
}
語法
getRequestPath();
相關聯的權限
getRequestQueryParameter
傳回具名查詢字串參數的解碼值 (字串),如果參數不存在,則傳回 undefined。如果查詢字串中重複出現參數,系統會傳回查詢字串中顯示的第一個值。
範例
const getRequestQueryParameter = require('getRequestQueryParameter');
const query = getRequestQueryParameter('query');
if (query) {
// Process query here.
}
語法
getRequestQueryParameter(name);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
name |
string | 查詢參數名稱。 |
相關聯的權限
getRequestQueryParameters
以物件形式傳回傳入的 HTTP 要求查詢參數,將查詢參數名稱對應至相應的值或值。參數名稱和值會經過解碼。
範例
const getRequestQueryParameters = require('getRequestQueryParameters');
const queryParameters = getRequestQueryParameters();
if (queryParameters['search']) {
// Handle the search query here.
const maxResults = queryParameters['max_results'];
}
語法
getRequestQueryParameters();
相關聯的權限
getRequestQueryString
傳回要求查詢 (字串形式,不含開頭的問號),如果要求網址不含查詢字串,則傳回空字串。
範例
const getRequestQueryString = require('getRequestQueryString');
const queryString = getRequestQueryString();
if (queryString !== '') {
// Handle the query string.
}
語法
getRequestQueryString();
相關聯的權限
getTimestamp
已淘汰。建議使用 getTimestampMillis。
傳回 number,代表自 Unix 紀元以來經過的毫秒數,與 Date.now() 傳回的值相同。
語法
getTimestamp();
相關聯的權限
無。
getTimestampMillis
傳回 number,代表自 Unix 紀元以來經過的毫秒數,與 Date.now() 傳回的值相同。
語法
getTimestampMillis();
相關聯的權限
無。
getType
傳回描述指定值類型的字串。
| 輸入類型 | 傳回值 |
|---|---|
| string | 'string' |
| number | 'number' |
| boolean | 'boolean' |
| 空值 | 'null' |
| 未定義 | 'undefined' |
| 陣列 | 'array' |
| 物件 | 'object' |
| 功能 | 'function' |
範例
const getType = require('getType');
const type = getType(value);
if (type === 'string') {
// Handle string input.
} else if (type === 'number') {
// Handle numeric input.
} else {
logToConsole('Unsupported input type: ', type);
}
語法
getType(value);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
value |
any | 輸入值。 |
相關聯的權限
無。
hmacSha256
使用雜湊式訊息驗證碼 (HMAC) 和 SHA-256 計算編碼簽章。預設為 base64url 編碼。
如要使用這項 API,請在伺服器上將 SGTM_CREDENTIALS 環境變數設為 UTF-8 編碼 JSON 金鑰檔案的路徑,格式如下:
{
"keys": {
"key1": "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5",
"key2": "OTg3NjU0MzIxMHp5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2Jh",
...
}
}
這些值是經過 base64 編碼的 HMAC 金鑰。JSON 文字開頭不得為位元組順序標記。
範例
const hmacSha256 = require('hmacSha256');
const toBase64 = require('toBase64');
const header = toBase64('{"alg":"HS256","typ":"JWT"}', {urlEncoding: true});
const claim = toBase64('{"sub":"1234567890","iat":1698164946}', {urlEncoding: true});
const signature = hmacSha256(header + '.' + claim, 'key1');
const jwt = header + "." + claim + '.' + signature;
語法
hmacSha256(data, keyId, options)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
data |
string | 用於計算 HMAC 值的資料。 |
keyId
|
字串 | JSON 金鑰檔案中的金鑰 ID,用於參照要使用的金鑰。 |
options
|
object | 選用 API 設定。(請參閱下方的「選項」)。 |
選項
| 選項 | 類型 | 說明 |
|---|---|---|
outputEncoding
|
字串 | 指定回傳值的編碼格式。支援的格式為 hex、base64 或 base64url。如未指定,則預設值為 base64url。 |
相關聯的權限
最低映像檔版本
isRequestMpv1
如果傳入的要求是 Measurement Protocol V1 要求,則傳回 true,否則傳回 false。
範例
const isRequestMpv1 = require('isRequestMpv1');
if (isRequestMpv1()) {
// Handle Measurement Protocol V1 request.
const events = extractEventsFromMpv1();
}
語法
isRequestMpv1();
相關聯的權限
無。
isRequestMpv2
如果傳入的要求是 Measurement Protocol V2 要求,則傳回 true,否則傳回 false。
範例
const isRequestMpv2 = require('isRequestMpv2');
if (isRequestMpv2()) {
// Handle Measurement Protocol V2 request.
const events = extractEventsFromMpv2();
}
語法
isRequestMpv2();
相關聯的權限
無。
logToConsole
將引數記錄到控制台。
您可以在 Google Cloud 控制台的記錄檔探索工具中查看這些記錄。
在 Logs Explorer 中執行查詢 logName =~ "stdout",查看這個 API 建立的記錄項目。
範例
const logToConsole = require('logToConsole');
const that = 123;
const those = { ... };
logToConsole('that is: ', that, ' and those is: ', those);
語法
logToConsole(argument1[, argument2, ...]);
參數
API 會接受一或多個引數,並視需要將每個引數轉換為字串,然後記錄到控制台。
相關聯的權限
makeInteger
將指定值轉換為數字 (整數)。
語法
makeInteger(value);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
value |
任何類型 | 要轉換的值。 |
相關聯的權限
無。
makeNumber
將指定值轉換為數字。
語法
makeNumber(value);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
value |
任何類型 | 要轉換的值。 |
相關聯的權限
無。
makeString
以字串形式傳回指定值。
語法
makeString(value);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
value |
任何類型 | 要轉換的值。 |
相關聯的權限
無。
makeTableMap
將含有兩欄的簡單表格物件轉換為 Map。這項功能可將兩欄的 SIMPLE_TABLE 範本欄位轉換為更容易管理的格式。
舉例來說,這個函式可以轉換表格物件:
[
{'key': 'k1', 'value': 'v1'},
{'key': 'k2', 'value': 'v2'}
]
地圖:
{
'k1': 'v1',
'k2': 'v2'
}
傳回 Object:轉換後的鍵/值組合已新增至該物件,否則為 null。Map
語法
makeTableMap(tableObj, keyColumnName, valueColumnName);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
tableObj |
清單 |
要轉換的表格物件。這是對應清單,其中每個 Map 代表表格中的一個資料列。資料列物件中的每個屬性名稱都是資料欄名稱,而屬性值則是資料列中的資料欄值。
|
keyColumnName |
string |
資料欄名稱,其值會成為轉換後物件中的鍵。
Map。
|
valueColumnName |
string |
資料欄名稱,其值會成為轉換後 Map 中的值。
|
相關聯的權限
無。
parseUrl
傳回的物件包含指定網址的所有元件部分,類似於 URL 物件。
如果網址格式錯誤,這個 API 會傳回 undefined。如果是格式正確的網址,網址字串中沒有的欄位會是空字串值,如果是 searchParams,則會是空物件。
傳回的物件會包含下列欄位:
{
href: string,
origin: string,
protocol: string,
username: string,
password: string,
host: string,
hostname: string,
port: string,
pathname: string,
search: string,
searchParams: Object<string, (string|Array)>,
hash: string,
}
範例
const parseUrl = require('parseUrl');
const urlObject = parseUrl('https://abc:xyz@example.com:8080/foo?param=val%2Cue#bar');
語法
parseUrl(url);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
url |
string | 要剖析的完整網址。 |
相關聯的權限
無。
returnResponse
使用可修改回應的 API (包括 setCookie、setPixelResponse、setResponseBody、setResponseHeader 和 setResponseStatus),清除先前由其他範本設定的回應。預設為 HTTP 狀態碼 200、空白主體,且沒有標頭。
建議從用戶端範本使用這個 API。
語法
returnResponse();
範例
請參閱runContainer範例。
相關聯的權限
runContainer
在事件範圍內執行容器邏輯 (變數、觸發條件、代碼)。如果在容器執行期間呼叫此 API,系統會再次執行容器。
onComplete 和 onStart 回呼會收到名為 bindToEvent 的函式。使用 bindToEvent 在事件的環境中執行 API。
詳情請參閱「addEventCallback 範例」。
建議從用戶端範本使用這個 API。
const returnResponse = require('returnResponse');
const runContainer = require('runContainer');
// Runs the container with a simple pageview event and then returns a response.
runContainer({'event_name': 'pageview'}, () => returnResponse());
語法
runContainer(event, onComplete, onStart);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
event |
物體 | 事件參數。 |
onComplete |
function | 所有代碼觸發完畢後叫用的回呼。 |
onStart |
function | 系統會立即叫用此回呼,在代碼開始觸發前執行。 |
相關聯的權限
sendEventToGoogleAnalytics
使用通用事件資料將單一事件傳送至 Google Analytics,並傳回會解析為具有 location 鍵的物件,或拒絕為具有 reason 鍵的物件的 Promise。目的地 Google Analytics 4 是根據事件資料中的評估 ID 而定。
如果存在 location 標頭,則 location 欄位會設為該標頭。
範例
const logToConsole = require('logToConsole');
const sendEventToGoogleAnalytics = require('sendEventToGoogleAnalytics');
const setResponseHeader = require('setResponseHeader');
const setResponseStatus = require('setResponseStatus');
// Sends an event to Google Analytics and returns failure if the request did not
// succeed. Additionally, if the request resulted in a redirect request, the
// code nominates a redirect response to be returned.
sendEventToGoogleAnalytics(event).then((response) => {
if (response.location) {
setResponseHeader('location', response.location);
setResponseStatus(302);
} else {
setResponseStatus(200);
}
data.gtmOnSuccess();
}).catch((error) => {
logToConsole(error.reason);
setResponseStatus(500);
data.gtmOnFailure();
});
語法
sendEventToGoogleAnalytics(event);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
event |
物體 | 採用統一結構定義格式的事件。 |
相關聯的權限
需要 send_http 權限。權限必須設定為允許存取至少下列項目:
- 允許 Google 網域
sendHttpGet
向指定網址發出 HTTP GET 要求,並傳回 Promise,要求完成或逾時後會以結果解析。
解析結果是包含三個鍵的物件:statusCode、headers 和 body。如果要求失敗 (例如網址無效、沒有主機路徑、SSL 協議失敗等),Promise 會連同 {reason:
'failed'} 一併拒絕。如果已設定 timeout 選項,且要求逾時,承諾會拒絕並傳回:{reason: 'timed_out'}
範例
const sendHttpGet = require('sendHttpGet');
// Returns the response body as the value for a variable.
return sendHttpGet('https://example.com/item/' + data.itemId, {
headers: {key: 'value'},
timeout: 500,
}).then((result) => result.body, () => undefined);
語法
sendHttpGet(url[, options]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
url |
string | 要求的網址。 |
options
|
object | 選用要求選項。(請參閱下方的「選項」)。 |
選項
| 選項 | 類型 | 說明 |
|---|---|---|
headers |
string | 其他要求標頭。 |
timeout
|
number | 要求逾時時間 (以毫秒為單位),逾時後要求會中止。預設值為 15000。 |
authorization
|
object | 來自 getGoogleAuth 呼叫的選用授權物件,用於在對 googleapis.com 提出要求時加入授權標頭。 |
相關聯的權限
sendHttpRequest
向指定網址發出 HTTP 要求,並傳回 Promise,要求完成或逾時後,Promise 會以回應解析。
解析結果是包含三個鍵的物件:statusCode、headers 和 body。如果要求失敗 (例如網址無效、沒有主機路徑、SSL 協議失敗等),Promise 會連同 {reason:
'failed'} 一併拒絕。如果已設定 timeout 選項,且要求逾時,承諾會拒絕並傳回:{reason: 'timed_out'}
範例
const sendHttpRequest = require('sendHttpRequest');
const setResponseBody = require('setResponseBody');
const setResponseHeader = require('setResponseHeader');
const setResponseStatus = require('setResponseStatus');
const postBody = 'interaction=click&campaign=promotion&medium=email';
// Sends a POST request and nominates response based on the response to the POST
// request.
sendHttpRequest('https://example.com/collect', {
headers: {key: 'value'},
method: 'POST',
timeout: 500,
}, postBody).then((result) => {
setResponseStatus(result.statusCode);
setResponseBody(result.body);
setResponseHeader('cache-control', result.headers['cache-control']);
});
語法
sendHttpRequest(url[, options[, body]]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
url |
string | 要求的網址。 |
options
|
object | 選用要求選項。(請參閱下方的「選項」)。 |
body |
string | 選用要求主體。 |
選項
| 選項 | 類型 | 說明 |
|---|---|---|
headers |
string | 其他要求標頭。 |
method |
物體 | 要求方法。預設值為 GET。 |
timeout
|
number | 要求逾時時間 (以毫秒為單位),逾時後要求會中止。預設值為 15000。 |
authorization
|
object | 來自 getGoogleAuth 呼叫的選用授權物件,用於在對 googleapis.com 提出要求時加入授權標頭。 |
相關聯的權限
sendPixelFromBrowser
向瀏覽器傳送指令,將提供的網址載入為 <img> 標記。Google 代碼支援這項指令通訊協定,適用於 GA4 和 Google Analytics:GA 事件網頁代碼。您必須設定伺服器容器網址。詳情請參閱操作說明。
如果傳入的要求不支援指令通訊協定,或回應已排清,這個 API 會傳回 false。否則,這個 API 會傳回 true。
範例:
const sendPixelFromBrowser = require('sendPixelFromBrowser');
sendPixelFromBrowser('https://example.com/?id=123');
語法
sendPixelFromBrowser(url)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
url |
string | 要傳送至瀏覽器的網址。 |
相關聯的權限
setCookie
設定或刪除具有指定選項的 Cookie。
如要刪除 Cookie,必須使用與建立 Cookie 時相同的路徑和網域設定 Cookie,並指派過去的到期值,例如 "Thu, 01 Jan 1970 00:00:00 GMT"。
請注意,您必須呼叫 returnResponse,回應才會傳回給用戶端。
範例
const setCookie = require('setCookie');
// Sets an httpOnly cookie with a max-age of 3600.
setCookie('cookieName', 'cookieValue', {'max-age': 3600, httpOnly: true});
語法
setCookie(name, value[, options[, noEncode]]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
name |
string | Cookie 名稱。名稱不區分大小寫。 |
value |
string | Cookie 值。 |
options |
物體 | 選用 Cookie 屬性:domain、 expires、 fallbackDomain、httpOnly、max- age、path、secure、 和sameSite。(請參閱下方的「選項」一節)。 |
noEncode |
boolean |
如為 true,系統就不會編碼 Cookie 值。預設值為 false。
|
網域:用來接收 Cookie 的主機。若設為特殊值「auto」,系統會自動使用下列策略計算主機:
Forwarded標頭的 eTLD+1 (如有)。X-Forwarded-Host標頭的 eTLD+1 (如有)。Host標頭的 eTLD+1。
expires:Cookie 的最長生命週期。這必須是世界標準時間格式的日期字串,例如「Sat, 26 Oct 1985 08:21:00 GMT」。如果同時設定
expires和max-age,則以max-age為優先。httpOnly:如果
true,禁止 JavaScript 存取 Cookie。max-age:Cookie 過期前的秒數。如果輸入零或負數,Cookie 會立即失效。如果同時設定
expires和max-age,max-age的效力優先。路徑:要求網址中必須存在的路徑,否則瀏覽器不會傳送 Cookie 標頭。
secure:如果設為
true,只有在要求來自https:端點時,系統才會將 Cookie 傳送至伺服器。sameSite:聲明不得隨跨來源要求傳送 Cookie。必須是
'strict'、'lax'或'none'。
相關聯的權限
setPixelResponse
將回應內文設為 1x1 GIF、將 Content-Type 標頭設為「image/gif」、設定快取標頭,讓使用者代理程式不會快取回應,並將回應狀態設為 200。
請注意,您必須呼叫 returnResponse,回應才會傳回給用戶端。
語法
setPixelResponse();
相關聯的權限
需要 access_response 權限。權限必須設定為允許存取至少下列項目:
headers- 必須允許下列鍵:content-typecache-controlexpirespragma
bodystatus
setResponseBody
將回應主體設為引數。
請注意,您必須呼叫 returnResponse,回應才會傳回給用戶端。
語法
setResponseBody(body[, encoding]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
body |
string | 要設為回應內文的值。 |
encoding |
string |
回應主體的字元編碼 (預設為 'utf8')。支援的值包括 'ascii'、'utf8'、'utf16le'、'ucs2'、'base64'、'latin1'、'binary' 和 'hex'。 |
相關聯的權限
需要 access_response 權限。權限必須設定為允許存取至少下列項目:
body
setResponseHeader
在要傳回的回應中設定標頭。如果這個 API 先前已設定名稱 (不區分大小寫) 相同的標頭,後續的呼叫會覆寫或清除先前呼叫端設定的值。
請注意,您必須呼叫 returnResponse,回應才會傳回給用戶端。
語法
setResponseHeader(name, value);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
name |
string | 標頭名稱。HTTP 標頭名稱不區分大小寫,因此標頭名稱會改為小寫。 |
value |
string undefined | 標頭值。如果是空值或未定義,這會從要傳回的回應中清除具名標頭。 |
相關聯的權限
需要 access_response 權限。權限必須設定為允許存取至少下列項目:
headers
setResponseStatus
設定要傳回的回應 HTTP 狀態碼。
請注意,您必須呼叫 returnResponse,回應才會傳回給用戶端。
語法
setResponseStatus(statusCode);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
statusCode |
number | 要傳回的 HTTP 狀態碼。 |
相關聯的權限
需要 access_response 權限。權限必須設定為允許存取至少下列項目:
status
sha256
計算輸入內容的 SHA-256 摘要,並以 Base64 編碼的摘要叫用回呼,除非 options 物件指定不同的輸出編碼。
這個 API 簽章和行為與網頁容器的 sha256 API 相符,但伺服器容器中的自訂範本應使用 sha256Sync API,程式碼會更簡單。
範例
const encodeUriComponent = require('encodeUriComponent');
const sendHttpGet = require('sendHttpGet');
const sha256 = require('sha256');
sha256('inputString', (digest) => {
sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digest));
});
sha256('inputString', (digest) => {
sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digest));
}, {outputEncoding: 'hex'});
語法
sha256(input, onSuccess, options = undefined);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
input |
string | 要雜湊的字串。 |
onSuccess |
function |
使用以 Base64 編碼的結果摘要呼叫,除非 options 物件指定其他輸出編碼。
|
options |
物體 |
選用選項物件,用於指定輸出編碼。如果指定了這個屬性,物件應包含鍵 outputEncoding,值為 base64 或 hex。 |
相關聯的權限
無。
sha256Sync
計算並傳回以 Base64 編碼的輸入內容 SHA-256 摘要,除非 options 物件指定不同的輸出編碼。
範例
const encodeUriComponent = require('encodeUriComponent');
const sendHttpGet = require('sendHttpGet');
const sha256Sync = require('sha256Sync');
const digestBase64 = sha256Sync('inputString');
const digestHex = sha256Sync('inputString', {outputEncoding: 'hex'});
sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digestBase64));
sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digestHex));
語法
sha256Sync(input, options = undefined);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
input |
string | 要雜湊的字串。 |
options |
物體 |
選用選項物件,用於指定輸出編碼。如果指定了這個屬性,物件應包含鍵 outputEncoding,值為 base64 或 hex。 |
相關聯的權限
無。
templateDataStorage
傳回的物件包含存取範本資料儲存空間的方法。範本資料儲存空間可讓單一範本的執行作業共用資料。儲存在範本資料儲存空間的資料會保留在執行容器的伺服器上。在大多數情況下,執行容器的伺服器不只一台,因此將資料儲存在範本資料儲存空間中,無法保證後續每個要求都能存取資料。
「templateDataStorage」名稱中的「data」是指只能使用這個 API 儲存純資料,而非函式資料型別。傳遞至 API 的任何函式或函式參照都會改為儲存為 null。
語法
const templateDataStorage = require('templateDataStorage');
// Returns a copy of the value stored for the given key, or null if nothing
// is stored with that key.
templateDataStorage.getItemCopy(key);
// Stores a copy of the value for the given key (or removes the data stored
// for the given key if the input value is null).
templateDataStorage.setItemCopy(key, value);
// Removes the value stored for the given key, if present.
templateDataStorage.removeItem(key);
// Deletes all values stored for the current template.
templateDataStorage.clear();
範例
const sendHttpGet = require('sendHttpGet');
const setResponseBody = require('setResponseBody');
const setResponseStatus = require('setResponseStatus');
const templateDataStorage = require('templateDataStorage');
// Check to see if the item is in the cache.
const cachedBody = templateDataStorage.getItemCopy(data.key);
if (cachedBody) {
setResponseBody(cachedBody);
data.gtmOnSuccess();
return;
}
sendHttpGet(data.url).then((result) => {
if (result.statusCode >= 200 && result.statusCode < 300) {
setResponseBody(result.body);
templateDataStorage.setItemCopy(data.key, result.body);
data.gtmOnSuccess();
} else {
data.gtmOnFailure();
}
setResponseStatus(result.statusCode);
});
相關聯的權限
testRegex
根據透過 createRegex API 建立的 regex 測試字串。如果符合規則運算式,則傳回 true。如果是其他情況,則傳回 false。
使用全域旗標建立的 regex 具有狀態。詳情請參閱 RegExp 說明文件。
範例
const createRegex = require('createRegex');
const testRegex = require('testRegex');
const domainRegex = createRegex('\\w+\\.com', 'i');
// createRegex returns null if the regex is invalid or Re2 is not available.
if (domainRegex === null) return;
// Returns true
testRegex(domainRegex, 'example.com/foobar');
語法
testRegex(regex, string);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
regex |
物件 | 要測試的規則運算式,由 createRegex API 傳回。 |
string |
string | 要測試的測試字串。 |
相關聯的權限
無。
toBase64
將字串編碼為 base64 或 base64url。預設為 base64 編碼。
語法
toBase64(input, options);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
input |
string | 要編碼的字串。 |
options
|
object | 選用 API 設定。(請參閱下方的「選項」)。 |
選項
| 選項 | 類型 | 說明 | 最低版本 |
|---|---|---|---|
urlEncoding
|
布林值 | 如果為 true,結果會以 base64url 格式編碼。 |
1.0.0 |
範例
const toBase64 = require('toBase64');
const base64Hello = toBase64('hello');
const base64UrlHello = toBase64('hello', {urlEncoding: true});
相關聯的權限
無。
BigQuery
傳回提供 BigQuery 函式的物件。
BigQuery.insert 函式可將資料寫入 BigQuery 資料表。這個方法會傳回 Promise,在插入成功時解析,或在發生錯誤時拒絕。
插入成功時,promise 會解析,但不含任何引數。
如果插入失敗,Promise 會拒絕,並傳回包含錯誤原因的物件清單,如果發生錯誤,可能也會傳回資料列物件。要求可能部分完成,但其他部分未完成。在這種情況下,系統會拒絕 Promise,並提供每個資料列的錯誤清單和資料列物件,協助您區分插入的資料列 (請參閱下方的「錯誤範例」)。詳情請參閱 BigQuery 的錯誤訊息說明文件。
語法
BigQuery.insert(connectionInfo, rows[, options]);
| 參數 | 類型 | 說明 |
|---|---|---|
connectionInfo |
物體 |
定義連線至 BigQuery 資料表所需資訊。其中一個是選用參數,另外兩個是必要參數:
|
rows |
陣列 | 要插入資料表的資料列。 |
options |
物體 | 選用要求選項。支援的選項包括:ignoreUnknownValues 和 skipInvalidRows。系統會忽略不明的選項鍵。(請參閱下方的「選項」)。 |
| 參數 | 類型 | 說明 |
|---|---|---|
ignoreUnknownValues |
boolean | 如果設為 true,系統會接受含有與結構定義不符值的資料列。系統會忽略不明的值。預設值為 false。 |
skipInvalidRows |
boolean | 如果設為 true,即使有無效的資料列,系統也會插入要求中的所有有效資料列。預設為 false。 |
如果出現找不到模組的錯誤,表示伺服器容器可能正在執行舊版映像檔,其中尚未包含 BigQuery 模組。請使用我們的部署指令碼,以相同設定重新部署伺服器容器。作業完成後,系統會自動加入模組。
非插入錯誤通常有一個含有 reason 鍵的錯誤物件:
[{reason: 'invalid'}]
插入錯誤可包含多個錯誤物件,以及 errors 陣列和 row 物件。以下是插入兩列時發生錯誤的回應範例,其中只有一列發生錯誤:
[
{
"errors": [
{
"reason":"invalid"
}
],
"row": {
"string_col":"otherString",
"number_col":-3,
"bool_col":3
}
},
{
"errors": [
{
"reason":"stopped"
}
],
"row": {
"string_col":"stringValue",
"number_col":5,
"bool_col:false
}
}
]
範例
const BigQuery = require('BigQuery');
const connectionInfo = {
'projectId': 'gcp-cloud-project-id',
'datasetId': 'destination-dataset',
'tableId': 'destination-table',
};
const rows = [{
'column1': 'String1',
'column2': 1234,
}];
const options = {
'ignoreUnknownValues': true,
'skipInvalidRows': false,
};
BigQuery.insert(connectionInfo, rows, options)
.then(data.gtmOnSuccess, data.gtmOnFailure);
相關聯的權限
Firestore
傳回提供 Firestore 函式的物件。
這個 API 僅支援原生模式的 Firestore,不支援 Datastore 模式的 Firestore。此外,這個 API 僅支援使用預設資料庫。
Firestore.read
Firestore.read 函式會從 Firestore 文件讀取資料,並傳回 Promise,該 Promise 會解析為包含兩個鍵的物件:id 和 data。如果文件不存在,Promise 會拒絕,並傳回含有 reason 鍵 (等於 not_found) 的物件。
語法
Firestore.read(path[, options]);
| 參數 | 類型 | 說明 |
|---|---|---|
path |
string | 這是文件或集合的路徑。開頭或結尾不得為「/」。 |
options |
物體 | 選用要求選項。支援的選項包括: projectId、disableCache 和 transaction。系統會忽略不明的選項鍵。(請參閱下方的「選項」)。 |
| 參數 | 類型 | 說明 |
|---|---|---|
projectId |
string | (選用) Google Cloud Platform 專案 ID。如果省略,系統會從環境變數 GOOGLE_CLOUD_PROJECT 擷取 projectId,前提是專案 ID 的 access_firestore 權限設定為 * 或 GOOGLE_CLOUD_PROJECT。如果伺服器容器在 Google Cloud 上執行,GOOGLE_CLOUD_PROJECT 會預設為 Google Cloud 專案的 ID。 |
disableCache |
boolean | (選用) 決定是否要停用快取。 快取功能預設為啟用,可將結果快取一段時間。 |
transaction |
string | (選用) 從 Firestore.runTransaction() 擷取的值。標記要在交易中使用的作業。 |
範例
const Firestore = require('Firestore');
return Firestore.read('collection/document', {
projectId: 'gcp-cloud-project-id',
}).then((result) => result.data.key, () => undefined);
Firestore.write
Firestore.write 函式會將資料寫入 Firestore 文件或集合。如果是集合的路徑,系統會建立文件並隨機產生 ID。如果是文件路徑,且該路徑不存在,系統會建立該路徑。這個 API 會傳回 Promise,解析為新增或修改的文件 ID。如果使用交易選項,API 仍會傳回 Promise,但由於寫入作業是批次處理,因此不會包含 ID。
語法
Firestore.write(path, input[, options]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
path |
string | 這是文件或集合的路徑。開頭或結尾不得為「/」。 |
input |
物體 | 要寫入文件的值。如果設定了合併選項,API 會將輸入內容中的鍵合併至文件。 |
options |
物體 | 選用要求選項。支援的選項包括: projectId、merge 和 transaction。系統會忽略不明的選項鍵。(請參閱下方的「選項」)。 |
| 參數 | 類型 | 說明 |
|---|---|---|
projectId |
string | (選用) Google Cloud Platform 專案 ID。如果省略,系統會從環境變數 GOOGLE_CLOUD_PROJECT 擷取 projectId,前提是專案 ID 的 access_firestore 權限設定為 * 或 GOOGLE_CLOUD_PROJECT。如果伺服器容器在 Google Cloud 上執行,GOOGLE_CLOUD_PROJECT 會預設為 Google Cloud 專案的 ID。 |
merge |
boolean | (選用) 如果設為 true,則將輸入內容中的鍵合併至文件,否則這個方法會覆寫整個文件。預設值為 false。 |
transaction |
string | (選用) 從 Firestore.runTransaction() 擷取的值。標記要在交易中使用的作業。 |
範例
const Firestore = require('Firestore');
const input = {key1: 'value1', key2: 12345};
Firestore.write('collection/document', input, {
projectId: 'gcp-cloud-project-id',
merge: true,
}).then((id) => {
data.gtmOnSuccess();
}, data.gtmOnFailure);
Firestore.query
Firestore.query 函式會查詢指定集合,並傳回 Promise,該 Promise 會解析為符合查詢條件的 Firestore 文件陣列。Firestore 文件物件與上述
Firestore.read中列出的物件相同。如果沒有符合查詢條件的文件,傳回的 Promise 會解析為空陣列。
語法
Firestore.query(collection, queryConditions[, options]);
| 參數 | 類型 | 說明 |
|---|---|---|
collection |
string | 這是集合的路徑。開頭或結尾不得為「/」。 |
queryConditions |
陣列 | 查詢條件陣列。每項查詢都以陣列形式提供,包含三個值:鍵、運算子和 expectedValue。E.g.:
[[‘id’, ‘<’, ‘5’], [‘state’, ‘==’, ‘CA’]]。 這些條件會以 AND 運算符合併,產生查詢結果。如需相容的查詢運算子清單,請參閱 Firestore 的查詢運算子。 |
options |
物體 | 選用要求選項。支援的選項包括: projectId、disableCache、 limit 和 transaction。系統會忽略不明的選項鍵。(請參閱下方的「選項」)。 |
| 參數 | 類型 | 說明 |
|---|---|---|
projectId |
string | (選用) Google Cloud Platform 專案 ID。如果省略,系統會從環境變數 GOOGLE_CLOUD_PROJECT 擷取 projectId,前提是專案 ID 的 access_firestore 權限設定為 * 或 GOOGLE_CLOUD_PROJECT。如果伺服器容器在 Google Cloud 上執行,GOOGLE_CLOUD_PROJECT 會預設為 Google Cloud 專案的 ID。 |
disableCache |
boolean | (選用) 決定是否要停用快取。 快取功能預設為啟用,可將結果快取一段時間。 |
limit |
number | (選用) 變更查詢傳回的結果數上限,預設為 5。 |
transaction |
string | (選用) 從 Firestore.runTransaction() 擷取的值。標記要在交易中使用的作業。 |
範例
const Firestore = require('Firestore');
const queries = const queries = [['id', '==', '5']];
return Firestore.query('collection', queries, {
projectId: 'gcp-cloud-project-id',
limit: 1,
}).then((documents) => documents[0].data.key, () => undefined);
Firestore.runTransaction
使用者可透過 Firestore.runTransaction 函式,以不可分割的方式讀取及寫入 Firestore。如果發生並行寫入或其他交易衝突,系統會重試交易最多兩次。如果嘗試三次後仍失敗,API 會拒絕並傳回錯誤。如果交易成功,這項 API 會傳回 Promise,並解析為每個寫入作業的文件 ID 陣列;如果交易失敗,則會拒絕並傳回錯誤。
語法
Firestore.runTransaction(callback[, options]);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
callback |
function | 系統會使用字串交易 ID 叫用這個回呼。交易 ID 可傳遞至讀取/寫入/查詢 API 呼叫。這個回呼函式必須傳回 promise。 回呼最多會執行三次,然後才會失敗。 |
options |
物體 | 選用要求選項。目前僅支援 projectId 選項。系統會忽略不明的選項鍵。(請參閱下方的「選項」)。 |
| 參數 | 類型 | 說明 |
|---|---|---|
projectId |
string | (選用) Google Cloud Platform 專案 ID。如果省略,系統會從環境變數 GOOGLE_CLOUD_PROJECT 擷取 projectId,前提是專案 ID 的 access_firestore 權限設定為 * 或 GOOGLE_CLOUD_PROJECT。如果伺服器容器在 Google Cloud 上執行,GOOGLE_CLOUD_PROJECT 會預設為 Google Cloud 專案的 ID。 |
範例
const Firestore = require('Firestore');
const path = 'collection/document';
const projectId = 'gcp-cloud-project-id';
Firestore.runTransaction((transaction) => {
const transactionOptions = {
projectId: projectId,
transaction: transaction,
};
// Must return a promise.
return Firestore.read(path, transactionOptions).then((result) => {
const newInputCount = result.data.inputCount + 1;
const input = {key1: 'value1', inputCount: newInputCount};
return Firestore.write(path, input, transactionOptions);
});
}, {
projectId: projectId
}).then((ids) => {
data.gtmOnSuccess();
}, data.gtmOnFailure);
每個 Firestore 函式中的錯誤都會遭到拒絕,並傳回含有 reason 鍵的物件:
Firestore.read(...).then(onSuccess, (error) => {
if (error.reason === 'unknown') {
// Handle the unknown error here.
}
});
錯誤原因包括但不限於 Firestore REST API 錯誤代碼。
相關聯的權限
JSON
傳回提供 JSON 函式的物件。
parse() 函式會剖析 JSON 字串,建構字串所描述的值或物件。如果無法剖析值 (例如格式錯誤的 JSON),函式會傳回 undefined。如果輸入值不是字串,系統會強制轉換為字串。
stringify() 函式會將輸入內容轉換為 JSON 字串。如果無法剖析值 (例如物件有週期),這個方法會傳回 undefined。
範例
const JSON = require('JSON');
// The JSON input string is converted to an object.
const object = JSON.parse('{"foo":"bar"}');
// The input object is converted to a JSON string.
const str = JSON.stringify({foo: 'bar'});
語法
JSON.parse(stringInput);
JSON.stringify(value);
相關聯的權限
無。
Math
提供 Math 函式的物件。
語法
const Math = require('Math');
// Retrieve the absolute value.
const absolute = Math.abs(-3);
// Round the input down to the nearest integer.
const roundedDown = Math.floor(3.6);
// Round the input up to the nearest integer.
const roundedUp = Math.ceil(2.2);
// Round the input to the nearest integer.
const rounded = Math.round(3.1);
// Return the largest argument.
const biggest = Math.max(1, 3);
// Return the smallest argument.
const smallest = Math.min(3, 5);
// Return the first argument raised to the power of the second argument.
const powerful = Math.pow(3, 1);
// Return the square root of the argument.
const unsquared = Math.sqrt(9);
參數
數學函式參數會轉換為數字。
相關聯的權限
無。
Messages
下列 API 會共同運作,允許在容器的不同部分之間傳遞訊息。
addMessageListener
新增函式,用於監聽特定類型的訊息。使用 sendMessage API 傳送這類型的訊息時 (通常是透過標記),回呼會同步執行。回呼會使用兩個參數執行:
messageType:stringmessage:Object
如果在用戶端中新增回呼,回呼會接收該用戶端建立的所有事件訊息。如果回呼只應接收特定事件的訊息,請使用 runContainer API 的 onStart 函式,將這個 API 繫結至該事件。bindToEvent請參閱範例。
語法
const addMessageListener = require('addMessageListener');
addMessageListener('send_pixel', (messageType, message) => {
// This will be run whenever something sends a 'send_pixel' message.
});
參數
| 參數 | 類型 | 說明 |
|---|---|---|
messageType |
string | 要監聽的訊息類型。如果值不是字串,系統會強制轉換為字串。 |
callback |
function | 傳送適用訊息類型的訊息時要執行的回呼。如果回呼不是函式,API 就不會執行任何動作。 |
範例
const addMessageListener = require('addMessageListener');
const claimRequest = require('claimRequest');
const extractEventsFromMpv1 = require('extractEventsFromMpv1');
const returnResponse = require('returnResponse');
const runContainer = require('runContainer');
claimRequest();
addMessageListener('send_pixel', (messageType, message) => {
// This will be run whenever a tag sends a 'send_pixel' message.
});
const events = extractEventsFromMpv1();
let eventsCompleted = 0;
events.forEach((event, i) => {
runContainer(events[i], /* onComplete= */ () => {
if (events.length === ++eventsCompleted) {
returnResponse();
}
}, /* onStart= */ (bindToEvent) => {
if (i === 0) {
bindToEvent(addMessageListener)('send_pixel', (messageType, message) => {
// This will be called whenever a tag for the first event sends a
// 'send_pixel' message.
});
}
});
});
相關聯的權限
需要 use_message 權限。權限必須設為允許至少:
- 訊息類型為
listen或listen_and_send的Usage。
hasMessageListener
如果已為指定訊息類型新增訊息事件監聽器,則傳回 true。 否則會傳回 false。
語法
const hasMessageListener = require('hasMessageListener');
hasMessageListener('send_pixel');
相關聯的權限
無。
sendMessage
將指定類型的訊息傳送至已註冊的接聽程式。這項功能可用於將訊息從代碼傳送回執行容器的用戶端。
語法
const sendMessage = require('sendMessage');
sendMessage('send_pixel', {url: 'https://analytics.example.com/collect'});
參數
| 參數 | 類型 | 說明 |
|---|---|---|
messageType |
string | 要傳送的訊息類型。如果值不是字串,系統會強制轉換為字串。 |
message |
物體 | 要傳送的訊息。如果訊息不是物件,API 就不會採取任何行動。 |
相關聯的權限
需要 use_message 權限。權限必須設為允許至少:
- 訊息類型為
listen_and_send或send的Usage。
Object
傳回提供 Object 方法的物件。
keys() 方法提供標準程式庫 Object.keys() 行為。這個方法會傳回指定物件的可列舉屬性名稱陣列,順序與 for...in... 迴圈相同。如果輸入值不是物件,系統會強制轉換為物件。
values() 方法提供標準程式庫 Object.values() 行為。這個方法會傳回指定物件的可列舉屬性值陣列,順序與 for...in... 迴圈相同。如果輸入值不是物件,系統會強制轉換為物件。
entries() 方法提供標準程式庫 Object.entries() 行為。這個方法會傳回指定物件的可列舉屬性配對陣列,順序與 for...in... 迴圈相同。[key, value]如果輸入值不是物件,系統會強制轉換為物件。
freeze() 方法提供標準程式庫 Object.freeze() 行為。凍結物件後就無法再變更;凍結物件可防止新增屬性、移除現有屬性,以及變更現有屬性的值。freeze() 會傳回傳入的相同物件。原始或空值引數會視為凍結物件並傳回。
delete() 方法提供標準程式庫 delete 運算子行為。除非物件已凍結,否則系統會從物件中移除指定鍵。
與標準程式庫的刪除運算子類似,如果第一個輸入值 (objectInput) 是未凍結的物件,即使第二個輸入值 (keyToDelete) 指定不存在的鍵,也會傳回 true。在所有其他情況下,都會傳回 false。不過,這與標準程式庫的刪除運算子不同,差異如下:
- 「
keyToDelete」不得為以半形句號分隔的字串,指定巢狀金鑰。 delete()無法用於從陣列中移除元素。delete()無法用於從全域範圍移除任何屬性。
語法
Object.keys(objectInput)
Object.values(objectInput)
Object.entries(objectInput)
Object.freeze(objectInput)
Object.delete(objectInput, keyToDelete)
參數
Object.keys
| 參數 | 類型 | 說明 |
|---|---|---|
| objectInput | any | 要列舉金鑰的物件。如果輸入內容不是物件,系統會強制轉換為物件。 |
Object.values
| 參數 | 類型 | 說明 |
|---|---|---|
| objectInput | any | 要列舉值的物件。如果輸入內容不是物件,系統會強制轉換為物件。 |
Object.entries
| 參數 | 類型 | 說明 |
|---|---|---|
| objectInput | any | 要列舉鍵/值組合的物件。如果輸入內容不是物件,系統會強制轉換為物件。 |
Object.freeze
| 參數 | 類型 | 說明 |
|---|---|---|
| objectInput | any | 要凍結的物件。如果輸入內容不是物件,系統會將其視為凍結物件。 |
Object.delete
| 參數 | 類型 | 說明 |
|---|---|---|
| objectInput | any | 要刪除鍵的物件。 |
| keyToDelete | string | 要刪除的頂層鍵。 |
範例
const Object = require('Object');
// The keys of an object are enumerated in an array.
const keys = Object.keys({foo: 'bar'});
// The values of an object are enumerated in an array.
const values = Object.values({foo: 'bar'});
// The key/value pairs of an object are enumerated in an array.
const entries = Object.entries({foo: 'bar'});
// The input object is frozen.
const frozen = Object.freeze({foo: 'bar'});
// The key is removed from the input object.
const obj1 = {deleteme: 'value'};
Object.delete(obj1, 'deleteme');
// Only a top-level key can be specified as the key to delete.
const obj2 = {nested: {key: 'value'}};
Object.delete(obj2, 'nested.key'); // This has no effect.
Object.delete(obj2.nested, 'key'); // This deletes the nested key.
Promise
傳回提供方法以與 Promise 互動的物件。
Promise 在功能上等同於 JavaScript Promise。每個執行個體都有三種方法會傳回 Promise,讓您在 Promise 結算時採取進一步動作:
.then()- 處理已解決和遭拒的案件。這個方法會將兩個回呼做為參數,分別用於成功和失敗案例。.catch()- Handles the rejected cases only. 以一個回呼做為參數。.finally()- 提供程式碼執行方式,無論 Promise 是已解決或遭拒皆可執行。將一個回呼做為參數,並以不含引數的方式叫用。
傳回 promise 的變數等於 promise 的解析值,或 promise 遭拒時的 false。
範例
promise.then((resolvedValue) => {
// Handles when promise resolves.
}, (rejectedValue) => {
// Handles when promise rejects.
});
promise.catch((rejectedValue) => {
// Handles when promise rejects.
});
promise.finally(() => {
// Runs regardless of whether or not the previous promise resolves or
// rejects.
});
Promise.all
傳回的 Promise 會執行下列其中一項操作:
- 所有輸入內容都已解析,或
- 當任一輸入遭到拒絕時,就會拒絕
語法
Promise.all(inputs);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
inputs |
陣列 | 值或 Promise 的陣列。如果輸入內容不是 Promise,系統會將輸入內容當做 Promise 的已解析值傳遞。如果輸入內容不是陣列,系統會擲回錯誤。 |
範例
const Promise = require('Promise');
const sendHttpGet = require('sendHttpGet');
return Promise.all(['a', sendHttpGet('https://example.com')])
.then((results) => {
// results will equal: ['a', {statusCode: 200, headers: {}, body: ''}]
});
相關聯的權限
無。
Promise.create
建立在功能上與 JavaScript Promise 等效的 Promise。
語法
Promise.create(resolver);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
resolver |
function | 系統會使用兩個函式 (resolve 和 reject) 叫用函式。 系統會呼叫對應的參數時,傳回的 Promise 會解析或拒絕。如果解析器不是函式,則會擲回錯誤。 |
範例
const Promise = require('Promise');
return Promise.create((resolve, reject) => {
// Do asynchronous work that eventually calls resolve() or reject()
});
相關聯的權限
無。
測試 API
這些 API 可搭配沙箱 JavaScript 測試,為 Google 代碼管理工具中的自訂範本建立測試。這些測試 API 不需要 require() 陳述。[進一步瞭解自訂範本測試]。
assertApi
傳回比對器物件,可用於流暢地對指定 API 進行斷言。
語法
assertApi(apiName)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
apiName |
string | 要檢查的 API 名稱;與傳遞至 require() 的字串相同。 |
比對器
Subject.wasCalled()Subject.wasNotCalled()Subject.wasCalledWith(...expected)Subject.wasNotCalledWith(...expected)
範例
assertApi('sendPixel').wasCalled();
assertApi('getUrl').wasNotCalled();
assertApi('makeNumber').wasCalledWith('8');
assertApi('setInWindow').wasNotCalledWith('myVar', 'theWrongValue');
assertThat
assertThat API 是以 Google 的 [Truth] 程式庫為模型。這個函式會傳回物件,可用於流暢地對主體的值進行判斷。如果斷言失敗,測試會立即停止,並標示為失敗。不過,一項測試失敗不會影響其他測試案例。
語法
assertThat(actual, opt_message)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
actual |
any | 流暢性檢查中使用的值。 |
opt_message |
string | 如果斷言失敗,要列印的選用訊息。 |
比對器
| Matcher | 說明 |
|---|---|
isUndefined() |
判斷主體是否為 undefined。 |
isDefined() |
判斷主體是否為 undefined。 |
isNull() |
判斷主體是否為 null。 |
isNotNull() |
判斷主體是否為 null。 |
isFalse() |
判斷主體是否為 false。 |
isTrue() |
判斷主體是否為 true。 |
isFalsy() |
判斷主體是否為 falsy 值。虛假值包括 undefined、null、false、NaN、0 和 '' (空字串)。 |
isTruthy() |
判斷主體是否為真值。虛假值包括 undefined、null、false、NaN、0 和 '' (空字串)。 |
isNaN() |
判斷主體是否為 NaN 值。 |
isNotNaN() |
判斷主體是否為 NaN 以外的任何值。 |
isInfinity() |
判斷主體是否為正無限大或負無限大。 |
isNotInfinity() |
判斷主體是否為正或負無限大以外的任何值。 |
isEqualTo(expected) |
判斷主體是否等於指定值。這是值比較,而非參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
isNotEqualTo(expected) |
判斷主體是否不等於指定值。這是值比較,不是參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
isAnyOf(...expected) |
判斷主體是否等於其中一個指定值。這是值比較,不是參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
isNoneOf(...expected) |
判斷主體是否不等於任何指定值。這是值比較,而非參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
isStrictlyEqualTo(expected) |
判斷主體是否與指定值完全相等 (===)。 |
isNotStrictlyEqualTo(expected) |
判斷主體是否不嚴格等於 (!==) 指定值。 |
isGreaterThan(expected) |
Asserts that the subject is greater than (>) the given
value in an ordered comparison. |
isGreaterThanOrEqualTo(expected) |
判斷主體是否大於或等於 (>=) 排序比較中的指定值。 |
isLessThan(expected) |
在排序比較中,判斷主體是否小於 (<) 指定值。 |
isLessThanOrEqualTo(expected) |
Asserts that the subject is less than or equal to (<=)
the given value in an ordered comparison. |
contains(...expected) |
判斷主體是否為陣列或字串,且包含所有指定值 (順序不限)。這是值比較,而非參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
doesNotContain(...expected) |
判斷主體是否為陣列或字串,且不包含任何指定值。這是值比較,不是參照比較。 系統會以遞迴方式比較物件和陣列的內容。 |
containsExactly(...expected) |
判斷主體是否為陣列,其中包含所有指定值 (順序不限),且不含其他值。這是值比較,而非參照比較。系統會以遞迴方式比較物件和陣列的內容。 |
doesNotContainExactly(...expected) |
判斷主體是否為陣列,且包含一組與指定值不同的值 (順序不限)。這是值比較,而非參照比較。物件和陣列的內容會以遞迴方式比較。 |
hasLength(expected) |
判斷主體是否為具有指定長度的陣列或字串。 如果值不是陣列或字串,斷言一律會失敗。 |
isEmpty() |
判斷主體是否為空白陣列或字串 (長度 = 0)。如果值不是陣列或字串,斷言一律會失敗。 |
isNotEmpty() |
判斷主體是否為非空白的陣列或字串 (長度 > 0)。如果值不是陣列或字串,斷言一律會失敗。 |
isArray() |
判斷主體的型別是否為陣列。 |
isBoolean() |
判斷主體的型別是否為布林值。 |
isFunction() |
判斷主體類型是否為函式。 |
isNumber() |
判斷主體的型別是否為數字。 |
isObject() |
判斷主體類型是否為物件。 |
isString() |
判斷主體類型是否為字串。 |
範例
assertThat(undefined).isUndefined();
assertThat(id, 'ID must be defined').isDefined();
assertThat(null).isNull();
assertThat(undefined).isNotNull();
assertThat(true).isTrue();
assertThat(false).isFalse();
assertThat(1).isTruthy();
assertThat('').isFalsy();
assertThat(1/0).isInfinity();
assertThat(0).isNotInfinity();
assertThat(-'foo').isNaN();
assertThat(100).isNotNaN();
assertThat(sentUrl).isEqualTo('https://endpoint.example.com/?account=12345');
assertThat(category).isNotEqualTo('premium');
assertThat(5).isAnyOf(1, 2, 3, 4, 5);
assertThat(42).isNoneOf('the question', undefined, 41.9);
assertThat('value').isStrictlyEqualTo('value');
assertThat('4').isNotStrictlyEqualTo(4);
assertThat(['a', 'b', 'c']).contains('a', 'c');
assertThat(['x', 'y', 'z']).doesNotContain('f');
assertThat(['1', '2', '3']).containsExactly('3', '2', '1');
assertThat(['4', '5']).doesNotContainExactly('4');
assertThat('a string').hasLength(8);
assertThat([]).isEmpty();
assertThat('another string').isNotEmpty();
fail
如果提供訊息,會立即讓目前測試失敗,並列印該訊息。
語法
fail(opt_message);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
opt_message |
string | 選填錯誤訊息文字。 |
範例
fail('This test has failed.');
mock
mock API 可讓您覆寫 Sandboxed API 的行為。模擬 API 可安全地用於範本程式碼,但只能在測試模式下運作。系統會在每次執行測試前重設模擬。
語法
mock(apiName, returnValue);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
apiName |
string | 要模擬的 API 名稱,與傳遞至 require() 的字串相同 |
returnValue |
any | 要為 API 傳回的值,或要取代 API 呼叫的函式。如果 returnValue 是函式,系統會呼叫該函式來取代 Sandboxed API;如果 returnValue 不是函式,系統會傳回該值來取代 Sandboxed API。 |
範例
mock('encodeUri', "https://endpoint.example.com/?account=12345");
mock('sendPixel', function(url, onSuccess, onFailure) {
onSuccess();
});
mockObject
mockObject API 可讓您覆寫傳回物件的 Sandboxed API 行為。您可以在範本程式碼中使用這個 API,但只能在測試模式下運作。系統會在每次執行測試前重設模擬。
語法
mockObject(apiName, objectMock);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
apiName |
string | 要模擬的 API 名稱,與傳遞至 require() 的字串相同 |
objectMock |
物體 | 要為 API 傳回的值,或要取代 API 呼叫的函式。必須是物件。 |
範例
const storage = {};
let firestoreId = 1;
function asTestPromise(result) {
return {
then: (callback) => callback(result)
};
}
mockObject('Firestore', {
write: (collection, input) => {
storage[collection + '/' + (++firestoreId)] = input;
return asTestPromise(firestoreId);
},
read: (document) => asTestPromise({data: storage[document]})
});
runCode
在目前的測試環境中,使用指定的輸入資料物件執行範本的程式碼,也就是「程式碼」分頁的內容。
語法
runCode(data)
參數
| 參數 | 類型 | 說明 |
|---|---|---|
data |
物體 | 測試中使用的資料物件。 |
傳回值
傳回變數範本的變數值;傳回 undefined 適用於所有其他範本類型。
範例
runCode({field1: 123, field2: 'value'});