執行程式碼
執行程式碼動作會執行 JavaScript。您可以將工作流程中先前步驟的資料當作輸入資料傳遞到執行程式碼動作,並傳回後續步驟要用的值。
欄位
執行程式碼動作包含以下欄位。
欄位 | 說明 |
---|---|
輸入 | 必填。此 GraphQL 查詢會使用先前步驟中的資料作為執行程式碼動作的輸入資料。 |
輸出 | 必填。動作要傳回的資料表示形式,以 GraphQL 的結構描述定義語言 (SDL) 定義。 |
代碼 | 必填。執行程式碼動作將執行的 JavaScript。 |
您可以從執行程式碼 (Run code) 動作之前發生的步驟傳遞輸入資料。若要納入這些資料,可以在「輸入」(Input) 欄位中撰寫 GraphQL 查詢。從查詢傳回的資料可用作具 export default
標記的函數的 input
引數,依慣例會稱為 main
。
輸入查詢是 Flow 環境資料的查詢,而不是對 Shopify Admin API 的查詢。因此,您無法在輸入資料中插入 Shopify 查詢。此外,Flow 也會處理查詢中的 edges
和 nodes
,因此您不必在查詢中新增這些語法或其他分頁語法。
取得訂單備註和商品項目名稱的輸入範例:
{
order {
note
lineItems {
title
}
}
}
此資料會轉換為可在程式碼中使用的 input
變數:
export default function main(input) {
// input.order.note
// input.order.lineItems[0].title
}
輸入資料也可以在函數簽章中解構:
export default function main({order}) {
// order.note
// order.lineItems[0].title
}
中繼欄位
如要存取執行程式碼 (Run code) 中的單一中繼欄位值,您必須先將中繼欄位新增至 Flow 的環境資料中。您可以在執行程式碼 (Run code) 以外的任何動作或條件下完成此操作。例如,您可以新增「記錄輸出」(Log output) 動作,然後按照說明新增中繼欄位。
將中繼欄位新增至工作流程環境後,您就可以在 Run code 中存取該中繼欄位。例如,假設您新增了一個別名為 giftMessage
的「訂單」(Order) 中繼欄位。接著就可以在輸入查詢中存取該中繼欄位:
{
order {
giftMessage {
value
}
}
}
輸出資料
「執行程式碼」(Run code) 動作可傳回自訂資料。若要定義程式碼將傳回的資料類型,請使用「輸出」(Output) 欄位和 GraphQL 的結構描述定義語言 (SDL)。支援的輸出類型包含 String
、Int
、Float
、Boolean
和 ID
,這些類型符合 SDL 規範中有關指定必填欄位、清單和自訂資料的規定。
例如,若要傳回名為 giftMessage
的字串和名為 totalGifts
的數字:
type Output {
"The message to include in the gift"
giftMessage: String!
"The total number of gifts"
totalGifts: Int!
}
備註並非必要,但可用於描述 Flow UI 中的資料。若要在 JavaScript 程式碼中輸出此資料,請傳回與類型相符的物件:
export default function main(input) {
// your code
return {
giftMessage: 'Hello',
totalGifts: 1,
};
}
您也可以定義自訂類型以傳回更複雜的資料。例如:傳回名為 Gift
的類型,其中包含名為 message
的字串和名為 amount
的數字:
type Output {
"The gift to send"
gifts: [Gift!]!
}
type Gift {
"The message to include in the gift"
message: String!
"The total number of gifts"
amount: Int!
}
若要在此動作之後的步驟中存取此資料,請使用名為 Run code 的變數,該變數將根據您在執行程式碼動作設定中定義的 Output
結構描述鍵入。您可以在條件和動作中同時使用此變數。
Console.log
您可以使用 console.log
將資料輸出到 Flow 工作流程執行記錄,以進行疑難排解。輸出內容會顯示在工作流程的執行記錄中。例如,以下為有效內容:
export default function main(input) {
console.log('Hello, world!');
//Hello, world!
console.log(input);
// { order: { note: 'Hello', lineItems: [{ title: 'World' }] } }
console.log(input.order, 'is the order');
// { note: 'Hello', lineItems: [{ title: 'World' }] }
// is the order
return {
giftMessage: 'Hello',
totalGifts: 1,
};
}
您無法在「執行程式碼」(Run code) 動作中使用 console.info
、console.error
或其他函數。
範例
如需執行程式碼動作的範例,請參見 Flow 範例資源庫。
限制
執行程式碼動作具有以下限制:
- 「執行程式碼」(Run code) 動作支援 ECMA2020 JavaScript,但不支援 NodeJS 或 CommonJS API,也不支援匯入模組。
- 程式碼無法執行 HTTP 呼叫 (
fetch
)。 - 無法使用隨機和時鐘型函數。日期資料 (例如
scheduledAt
或createdAt
資料) 可以作為輸入傳入。 - Console.log 不會記錄到瀏覽器主控台。
- 您無法直接在執行程式碼動作 (Run code) 中新增中繼欄位別名。請查看中繼欄位區段,瞭解如何完成此操作。
此外,系統會強制執行以下限制:
- 輸入資料查詢上限為 5000 個字元。
- 輸出資料結構描述上限為 5000 個字元。
- 輸出資料酬載和 Console.log 輸出內容的總大小上限為 50 KB。
- 程式碼不能超過 50000 個字元。
- 總執行時間上限為 5 秒。
- 記憶體使用量上限為 10 MB。
範本
為新訂單新增免費(100% 折扣)品項
此範本為新訂單添加免費的折扣品項(如果品項有庫存的話)。範本會在不通知顧客的情況下檢查庫存、應用 100% 折扣,並更新訂單。這項自動化處理可有效 (1) 透過為顧客訂單提供驚喜免費品項,加強顧客滿意度;(2) 透過將新或較不知名的商品以免費樣本的形式添加到訂單當中,推廣這些商品;或者 (3) 透過自動化添加免費品項並提供折扣,簡化推廣過程。檢視範本
取消不活躍的退貨流程
自動取消在一段特定時間內未退款或重新入庫的退貨流程。檢視範本
使用「運行代碼」動作,將帶前綴的標記轉換至商品中繼欄位
此工作流程將擷取帶「color:」等前綴的標記,並將這些標記添加至商品中繼欄位清單。系統會使用「運行代碼」動作,剖析中繼欄位清單中的標記和現存品項。建立商品時會運行工作流程,但可以在現存商品中手動運行工作流程。檢視範本
顧客訂購多個商品子類時傳送通知
在顧客訂購多個相同商品的子類時,傳送電子郵件通知。檢視範本
訂單包含套裝組合時傳送通知
訂單建立時即啟動此工作流程,檢查訂單中是否有任何商品為套裝組合的一部分。如果有,系統會傳送包含套裝組合詳細資訊的內部電子郵件。此外,對於任何需要偵測訂單中是否存在套裝組合的使用案例,您可以使用此工作流程作為起點。檢視範本
標記具有相關聯 Urchin 流量監視器 (UTM) 行銷活動的訂單
對包含任何相關聯 Urchin 流量監視器 (UTM) 行銷活動名稱的訂單新增標籤。檢視範本