櫃檯常遇到這種客人:手機裡的捷徑做到一半,東西就「不見了」。明明上一步抓到了標題,到了下一個動作卻是空的;或是想把幾筆資料湊在一起,怎麼弄都只剩最後一筆。十之八九,問題不在捷徑本身,而是還沒分清楚「變數、清單、字典」這三種東西分別在裝什麼。
我自己帶人入門的時候,習慣這樣比喻:變數是一個袋子裝一樣東西,清單是一排袋子裝同類的東西,字典則是一個有標籤的收納盒,每格都標了名字。搞懂這三層,捷徑就不再只是「動作一個接一個」,而是能真的處理會變動的資料。
底下我用一個會貫穿全文的例子來講——「每日晨報摘要」捷徑:抓幾個 RSS 標題、篩掉不想看的、組成結構、最後推一則通知到手機。三種容器剛好全用上。
捷徑裡每個動作做完都會吐出一個「魔法變數」,下一個動作自動接住,這在直線流程裡很順。但只要流程一分岔——你加了『如果』,或是加了『重複每個項目』迴圈——魔法變數過了那道關卡就會失效。這就是門市最常見的「資料中途蒸發」的真兇。
解法是改用命名變數,等於幫袋子貼上名字,鎖死,之後想拿隨時拿。
建立的路徑是這樣:加入動作,搜尋「設定變數」,加入『設定變數』;「名稱」欄位填個你看得懂的,例如 今日日期;「輸入」接上前一個動作的輸出,或自己手打一個值。之後任何地方要用它,再搜尋「取得變數」加入『取得變數』,選 今日日期 就好。
有個觀念要先講清楚,不然後面會踩雷:命名變數是整條捷徑通用的,同一個捷徑裡不管在哪個位置,都能讀寫同名變數;但它不會跨捷徑共用。如果你想把值從 A 捷徑傳給 B 捷徑,得用『執行捷徑』,把值塞進「輸入」參數帶過去。
至於最常用的場景,其實是把變數塞進一段文字裡。加入『文字』動作,點進文字欄位,按右下角「插入變數」(或鍵盤上方那排的「Add Variable」),選 今日日期。內容就會長成 今天是 [今日日期],以下是摘要…,執行時自動換成真正的值。
清單就是把同一類的東西排成一排。先講最單純的靜態清單:加入動作搜尋「清單」,加入『清單』,動作出現後點「加入新項目」一條一條打進去,每一列就是清單裡的一個字串。固定選單最適合這種做法,比如讓使用者挑要啟動哪個情境模式。
真正的進階關卡在「動態組合清單」——一邊跑迴圈,一邊把結果累積起來。這裡有個捷徑長年的怪脾氣你得先知道:它沒有原生那種「把這筆加進清單」的動作(至少舊版沒有),所以早期大家是用換行硬湊出來的:
結果清單文字[結果清單文字]\n[重複項目](用換行把舊的跟新的接起來),再接『設定變數』,名字一樣是 結果清單文字,把舊值蓋掉結果清單文字,分隔符選「換行」這招有個討厭的副作用:第一圈跑的時候 結果清單文字 還是空的,會生出一個空白的第一列。處理方式是在『分割文字』後面補一個『篩選(過濾)』動作,條件設成「文字」「不是」「空的」,空列就清掉了。
如果想讓使用者自己從清單裡挑,建好清單後搜尋「從清單中選擇」加入『從清單中選擇』,「輸入」接前面那個清單;打開「允許多重選擇」就能一次勾好幾個;挑完的結果存進命名變數例如 使用者選擇,後面用『如果』判斷要走哪條路。
清單只能裝「一串值」,可是真實資料往往一筆裡有好幾個欄位——一篇文章同時有標題、網址、發布日期。這時候清單裝不下,得換字典。字典的每一組鍵值,就等於 JSON 裡的 "key": "value"。
靜態字典的做法:搜尋「字典」加入『字典』,點「加入新項目」填鍵(Key)跟值(Value),值的型別可以是文字、數字、布林值、陣列,甚至塞另一個字典做巢狀。我習慣把這種靜態字典當成「設定檔」擺在捷徑最上面,像這樣:
鍵: api_base 值: https://api.example.com
鍵: max_items 值: 10
鍵: language 值: zh-TW
要動態改某個鍵的值,一樣得繞一下——捷徑沒有「直接修改字典某格」的動作,要用『設定字典的值』:搜尋它加入後,「字典」選來源字典(或命名變數),「鍵」填要寫的鍵名,「至」填新值(可以插變數)。重點來了:它的輸出是一個全新的字典,不會改到原本那個,所以記得接『設定變數』把新的存回去。
讀值就單純多了:搜尋「從字典取得值」加入『從字典取得值』,「字典」選來源,「鍵」填要讀的鍵名。順帶一提,如果資料是從 Web API 抓來的 JSON,『取得 URL 的內容』會自動幫你把 JSON 解析成字典,直接用『從字典取得值』就能撈任何欄位。
巢狀資料這裡要多花一個動作。假設 JSON 長成 {"feed": {"title": "iLab"}},你在「鍵」欄位填 feed,拿到的是一個子字典;得再接一個『從字典取得值』填 title,才取得到 iLab。捷徑目前不吃「點記法」那種一步到位的寫法,乖乖串兩個動作。
把上面這些串起來,呼叫一個公開 API、撈出多個欄位的標準結構大致是這樣:
[取得 URL 的內容]
URL: https://api.example.com/news?lang=zh-TW&limit=5
方法: GET
↓ (輸出: 字典/JSON)
[從字典取得值]
字典: 上一步輸出
鍵: articles
↓ (輸出: 清單,每個元素是一篇文章字典)
[重複每個項目]
↓ 迴圈內:
[從字典取得值] 鍵: title → 儲存為 文章標題
[從字典取得值] 鍵: url → 儲存為 文章網址
[文字] [文章標題]\n[文章網址]
[加入至變數] 累積結果
[結束重複]
接下來這個骨架可以直接照打,變數、清單、字典三種一次到齊。
先做初始化設定字典:加『字典』,建鍵值 keywords = AI,Apple,iPhone、max = 5,接『設定變數』命名 設定。
再取資料、開迴圈:加『取得 URL 的內容』,URL 填你訂的 RSS JSON 端點;加『從字典取得值』,鍵填 items,撈出文章清單;加『重複每個項目』。
迴圈裡面過濾關鍵字:加『從字典取得值』鍵填 title,接『設定變數』命名 本篇標題;加『如果』,條件設 本篇標題 包含 AI(進階一點可以從 設定 字典把 keywords 撈出來再拆分,動態比對);條件成立時加『文字』放 [本篇標題],接『加入至變數』命名 標題清單;最後補『結束如果』。
最後輸出通知:迴圈跑完,加『取得變數』取回 標題清單;加『將清單合併成文字』,分隔符選「換行」;加『顯示通知』,標題 晨報摘要,內文選前一步的輸出。
到這裡要特別提一件事,因為它會省掉你不少功夫——
最常被拿著手機來問的,是這個:「我用『取得變數』讀出清單,進迴圈後『重複項目』怎麼只跑一次?」十次有八次,是因為那個變數裝的其實是「文字」不是「清單」。回去看設定變數之前那一步輸出了什麼——如果是『文字』動作,就算內容裡有換行,它整坨還是一個字串,得先接『分割文字』(分隔符選「換行」)才會變成真正的清單。另一個原因是迴圈裡不小心把清單蓋成了單一值,確認你用的是『加入至變數』(追加)而不是『設定變數』(覆蓋)。
還有人問:「字典能不能存進備忘錄或檔案,下次跑捷徑再讀回來?」可以,但要先序列化。把字典存成字串:搜尋「將字典編碼成 JSON」加入『將字典編碼成 JSON』,輸出就是標準 JSON 字串,再用『儲存檔案』寫到 iCloud Drive(路徑像 捷徑/config.json)。下次要讀,用『取得檔案』把字串讀回來,接『從輸入取得字典』就還原成字典了。整條路是:捷徑 → 設定 → iCloud Drive → 選或建一個資料夾,全程不用另外開別的 App。
這些動作講起來繞,但坐下來實際拼一次就會懂——手感比文字快太多。如果你想找台機器把捷徑這套玩到底,或是手上的 iPhone 跑起來總覺得卡,歡迎來店裡,我們直接拿真機操作給你看;也可以先到 /choose 用選機小幫手看看哪台適合你的用法。