執行程式碼
執行程式碼 動作會執行 JavaScript。您可以將工作流程中前幾個步驟的資料作為輸入傳給 執行程式碼 動作,並回傳資料供後續步驟使用。
欄位
執行程式碼 動作包含下列欄位。
| 欄位 | 說明 |
|---|---|
| 輸入 | 必填。GraphQL 查詢,用於將前幾個步驟的資料作為 執行程式碼 動作的輸入。 |
| 輸出 | 必填。以 GraphQL 的結構定義語言 (SDL) 定義,表示此動作要回傳的資料。 |
| 程式碼 | 必填。執行程式碼 動作要執行的 JavaScript。 |
輸入資料
可從 執行程式碼 動作之前的步驟傳入輸入資料。若要納入這些資料,您可以在 輸入 欄位撰寫 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
}中繼欄位
若要在「執行程式碼」中存取個別中繼欄位的值,您必須先將該中繼欄位加入 Flow 的環境資料。這可在「執行程式碼」以外的任何動作或條件中完成。舉例來說,您可以加入 記錄輸出 動作,然後 follow the instructions to add the metafield。
將中繼欄位加入工作流程環境後,您即可在「執行程式碼」中存取。舉例來說,假設您新增了一個別名為 giftMessage 的訂單中繼欄位,便可在輸入查詢中取用它:
{
order {
giftMessage {
value
}
}
}輸出資料
「執行程式碼」動作可以回傳自訂資料。若要定義程式碼會回傳的資料型別,請使用「輸出」欄位與 GraphQL 的 Schema definition language (SDL)。支援的輸出型別為 String、Int、Float、Boolean 與 ID,並遵循 SDL specification 來指定必填欄位、清單與自訂資料。
例如,若要回傳名為 giftMessage 的字串與名為 totalGifts 的數字:
type Output {
"The message to include in the gift"
giftMessage: String!
"The total number of gifts"
totalGifts: Int!
}註解為選填,但會用於在 Flow 介面中描述資料。若要在 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!
}若要在此動作後續步驟存取這些資料,請使用名為「執行程式碼」的變數。其型別會依您在「執行程式碼」動作設定中定義的 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,
};
}您不能在「執行程式碼」動作中使用 console.info、console.error 或其他函式。
範例
「執行程式碼」動作的範例可在 Flow examples repository 找到。
限制
「執行程式碼」動作有以下限制:
- 「執行程式碼」動作支援 ECMA2020 JavaScript。不支援 NodeJS 或 CommonJS API,也不支援匯入模組。
- 您的程式碼無法進行 HTTP 呼叫 (
fetch)。 - 不能使用隨機或依賴時鐘的函式。日期資料 (例如
scheduledAt或createdAt) 可以作為輸入傳入。 - Console.log 不會記錄到瀏覽器主控台。
- 為節省資料量,輸出只會回傳後續步驟中實際用到的變數。
- 您不能直接在「執行程式碼」動作中加入 metafield alias。若要達成此目的,請參考本頁面的 Metafields section。
此外,還會套用下列限制:
- 輸入資料查詢上限為 5,000 個字元。
- 輸出資料綱要上限為 5,000 個字元。
- 輸出資料與 Console.log 輸出的合計上限為 50KB。
- 程式碼長度不得超過 50,000 個字元。
- 總執行時間上限為 5 秒。
- 記憶體使用量上限為 10MB。
範本
將免費 (100% 折扣) 品項加入新訂單
此範本會在品項仍有庫存時,將免費 (100% 折扣) 的品項加入新訂單。系統會檢查庫存、套用 100% 折扣,並在不通知顧客的情況下更新訂單。此工作流程可協助自動化下列情境:
- 在訂單中額外附贈免費品項,提升顧客滿意度。
- 將新商品或較不知名的商品作為免費試用品加入訂單,以提升曝光。
- 透過自動加入免費品項並套用折扣,簡化促銷流程。
取消未處理的退貨流程
在一段時間內未退款或未補回庫存的退貨流程將自動取消。View template
使用「執行程式碼」動作,將具前綴的標籤轉換為商品中繼欄位
此工作流程會擷取以 'color:' 等前綴開頭的標籤,並將其加入商品的中繼欄位清單。它會使用「執行程式碼」動作來剖析這些標籤與中繼欄位清單中的既有品項。此工作流程會在建立商品時觸發,但也可在既有商品上手動執行。View template
當顧客訂購同一商品的多個子類時傳送通知
當顧客訂購同一商品的多個子類時,收到電子郵件通知。View template
當訂單包含套裝組合時傳送通知
此工作流程在建立訂單時啟動,會檢查訂單中的商品是否以套裝組合購買。若有,系統會傳送內部電子郵件並附上套裝組合詳情。此外,您也可將此工作流程作為需要偵測訂單內套裝組合之各種情境的起點。View template
為訂單加上相關 UTM 行銷活動標籤
將相關的 UTM 行銷活動名稱加為訂單標籤。View template