節點的欄位可以填固定的值,也可以填運算式,在執行時才算出來。這一頁說明兩者的差別、運算式怎麼寫,以及怎麼用釘選資料來試你的工作流。
固定值與運算式
- 固定值:照你打的字原樣使用。
- 運算式:寫在
{{ }}裡、節點執行時才算出來的值。例如{{ $json.email }},會變成進到這個節點的這一筆項目的email欄位。
欄位名稱的那一列,有「固定值」|「運算式」這一對按鈕,用來切換。游標指著這一格,或正在這一格打字時,它才會出現;這一格是運算式時,它一直都在。切換時,你打的字會留著。
存起來的樣子:一個值要以 = 開頭,才算是運算式。所以 Hello {{ $json.name }} 是一般的文字,=Hello {{ $json.name }} 才會算出來。按「運算式」時,網站會替你加上這個 =;自己寫 JSON 來匯入時,才要自己加。在運算式裡要寫真正的大括號,請在前面加一個反斜線,例如 \{{。
在固定值的框裡打了大括號時,大括號會變成琥珀色,框下面出現一個連結:「這個值含有 {{ }},要改用運算式嗎?」
注意:固定值框裡的大括號,會照原樣送出去。外部的服務收到的,是 {{ $json.image_url }} 這幾個字,不是算出來的值。要算出來,請把這一格切成「運算式」。
- 沒有這一對按鈕的欄位,不能用運算式,例如大部分的是非題和選單。
- 一個值剛好是一個
{{ }}、前後沒有別的字時,算出來的值會保留它的型別:數字還是數字,列表還是列表。前後有任何字時,就會變成文字。
運算結果
- 空的運算式框裡,灰色的字寫著「
{{ $json.欄位名稱 }}」。 - 你打字時,框的下面會出現「運算結果」,寫著算出來的值;還沒算好時,是「計算中…」或「還沒有結果。」。值是空的時,旁邊會寫著「(沒有值)」或「(空字串)」。
- 「運算結果」下面有一行「提示:」。這個節點拿得到資料時,框還是空的,它寫著「可以直接把左側「輸入資料」的欄位拖進來,不必自己輸入。」;打了字之後,它寫著「{{ }} 裡面寫的是 JavaScript 運算式,例如
{{ $json.name }}或{{ $json.price * 2 }}。」 - 這個節點還拿不到資料時,運算結果算不出真的值。要讓它有資料,請按上方列的「執行」跑一次整個工作流;或是在前面的節點釘選資料,按上方列的「儲存」,再重新打開這個節點。只執行前面那一個節點(「執行節點」或「儲存並執行」)不算。
- 運算結果不會執行這個節點。它用的是會送到這個節點的第一筆項目:來自前面節點存好的釘選資料,或最近一次跑完的整個執行。「輸入資料」那一格換成別的項目,運算結果也不會跟著換。
拖曳欄位
把「輸入資料」窗格裡的一個欄位,拖到一個框裡,它就會在你放下的地方,變成一段運算式:
- 看的是這個節點自己的輸入時,寫成
{{ $json.欄位 }}這樣。 - 畫面上是另一個節點的資料時,大括號裡寫成
$('節點名稱').item.json.欄位這樣。 - 「程式碼 (Code)」的「JavaScript」框不一樣:它本來就是程式,所以放下的是沒有大括號的路徑,例如
$json.欄位。
可以用的名稱
進來的這一筆項目
$json:這一筆項目的資料。$itemIndex:這是第幾筆,從 0 開始算。$input.item:整筆項目。$input.all():進來的全部項目。$input.first()與$input.last():第一筆與最後一筆。
另一個節點送出的資料
$("節點名稱").all():那個節點送出的全部項目。$("節點名稱").first()與$("節點名稱").last():第一筆與最後一筆。$("節點名稱").item:那個節點在同一個位置的那一筆。$node["節點名稱"].json:上一行的舊寫法。$items("節點名稱"):.all()的舊寫法。$item(0).$json:最舊的寫法,讀輸入裡某一個位置的項目。
這一次執行
$workflow:這個工作流的id與name。$execution:這一次執行的id與mode。$mode:這一次執行是怎麼開始的,例如manual、schedule或webhook。$runIndex:這個節點在這一次執行裡,已經跑過幾次。$prevNode:項目是從哪一個節點來的,裡面有name。$now:這個節點這一次開始跑的時間。同一次裡,節點的每一格和它的程式看到的都一樣;同一個節點再跑一次或重試一次,以及後面的節點,都會比較晚,經過「等待」之後可能晚很多。$today:同一天的午夜。
$now 與 $today 可以用 .plus()、.minus()、.startOf()、.endOf()、.toISO()、.toISODate() 與 .toFormat(),也可以讀 .year、.month、.day、.hour、.minute、.second 與 .weekday(星期一是 1)。例如 $now.plus({ days: 1 }) 是明天的這個時間,$now.toFormat('yyyy-MM-dd HH:mm') 會寫成日期加時間。
$now 與 $today 照「工作流設定」裡的「時區」算。這一格的說明寫著:「這個時區會決定這個工作流裡所有算式的 $now 和 $today,也是排程觸發的預設時區。」「時區」空著時,照網站自己的時區算。
另一個節點的資料,要注意這幾件事
$("節點名稱").item讀的,是那個節點在同一個位置的項目,不會真的去追哪一筆是從哪一筆來的。那個位置沒有項目時,會說讀不到,例如「節點「…」只有 … 筆資料,讀不到第 … 筆。」;名稱打錯,或那個節點還沒執行時,會寫著「找不到節點「…」的資料。它可能還沒執行,或名稱打錯了。」- 在做工作流的時候,
$('其他節點')只有在那個節點有存好的釘選資料(按過上方列的「儲存」),或在最近一次跑完的整個執行裡跑過時,才讀得到資料。 - 重新命名一個節點時,其他節點裡寫的
$("舊名稱")不會跟著改,要自己改。
n8n 有、這裡沒有的:Interval、Duration、.diff()、.setZone()、語系(locales)、$vars、$env、$parameter、$jmesPath、$secrets 與 await。用到它們的運算式會失敗。
條件
「條件判斷 (IF)」與「篩選 (Filter)」的「條件」,每一列有「左值 (Left Value)」、「運算子 (Operator)」與「右值 (Right Value)」。兩邊的值都可以用運算式。
「運算子 (Operator)」可以選:「等於」、「不等於」、「包含」、「不包含」、「開頭是」、「結尾是」、「是空的」、「不是空的」、「大於」、「大於或等於」、「小於」、「小於或等於」、「是 true」、「是 false」與「符合正規表示式」。其中「是空的」、「不是空的」、「是 true」與「是 false」只看左值,不用填右值。
有好幾列條件時,「條件組合 (AND / OR)」決定怎麼算:「全部成立 (AND)」或「任一成立 (OR)」。
- 條件沒有地方選型別。兩邊的值看起來都是數字時,就照數字比,所以
10比2大;其他的照文字比。 - 比較文字時,大小寫不一樣,就算不一樣。
- 「是空的」指的是沒有值、空的文字,或是空的列表。
0與false不算空的。
程式碼節點
「程式碼 (Code)」節點的「JavaScript」框,一開始寫著 return $input.all();。
- 程式碼的最後,一定要用
return交出結果。 - 「執行模式 (Mode)」是「所有項目執行一次」時:程式碼只跑一次,用
$input.all()拿到全部項目,交出一個項目的列表。 - 是「每個項目各執行一次」時:每一筆項目各跑一次,用
$json拿到這一筆,每一次交出一筆項目。 - 一筆項目的樣子是
{ json: { ... } }。交出一個沒有json的物件時,網站會替你包起來。 - 程式碼裡不能用
require、import、fetch與計時器,也不能讀寫檔案。
釘選資料
釘選資料,是你存在一個節點上的項目。在做工作流的時候,它代替這個節點真的去執行,讓你不用每一次都真的跑前面的節點。
- 在「輸出資料」窗格,圖釘按鈕(游標指著時顯示「釘選這些資料」)會把窗格裡現在的項目釘選起來,每一條出口各一份。已經釘選時,同一個按鈕是「取消釘選」。
- 鉛筆按鈕(游標指著時顯示「手動填寫輸出項目,儲存後會釘選。」)讓你自己用 JSON 打項目。打的時候,下面寫著:「儲存後會釘選這些資料。手動執行整個工作流時會直接使用,不會執行這個節點;排程與 Webhook 執行仍照常執行。按「儲存並執行」則會真的執行這個節點,並先問你要不要更新釘選資料。」
- 釘選了的窗格會寫著「已釘選」,節點卡片上也有一個圖釘。
- 節點右鍵選單的「釘選資料」,會打開這個節點的設定視窗,讓你在那裡釘選。「取消釘選資料」會馬上取消。
釘選資料只用在有人自己動手跑的時候:按上方列的「執行」、這種執行的「重試」,以及只跑一個節點時當作前面的輸入。排程、Webhook、對話與 AI 工具的執行,一定會真的執行這個節點。
- 在已經釘選的節點上按「儲存並執行」,會先問:「是否更新釘選資料?這個節點會真的執行一次。」下面有一個「覆蓋釘選資料」的勾選框,一開始是勾著的。只有執行成功時,才會換掉原本釘選的資料。
- 空的釘選還是釘選:按「執行」跑整個工作流時,這個節點什麼都不會給。但做工作流時的運算結果、
$('…'),以及後面節點的「儲存並執行」,會把空的釘選當成沒有釘選。在有空釘選的那個節點自己按「儲存並執行」,還是會問要不要更新釘選資料。 - 釘選的「條件判斷 (IF)」,一樣會把
true的項目從true送出,false的項目從false送出。 - 釘選資料存在工作流裡面:釘選或取消釘選,都算是還沒儲存的變更;「匯出 JSON」會把釘選資料一起帶出去;重新命名或刪掉一個節點時,它的釘選資料會跟著它改名或刪掉。
- 「執行」不會送出任何測試資料,所以只有一個「手動觸發」時,它只會給出一筆空的項目。要用你自己的資料來試,請在觸發節點上釘選項目。範例工作流就是這樣做的。