用 Apps Script 從 Google 表格批次生成動態 QR Code
要從 Google 表格生成動態 QR Code,每行放一個連結和你自己的業務編號,把一段簡短的 Apps Script 貼上到表格裡,把 API 令牌存進指令碼屬性,然後從菜單執行。指令碼會把這些行每 100 行一批發送給 QR Maker REST API,再把每一行的短連結寫回表格。再次執行時只會補全還空著的行,所以永遠不會重複建立。
什麼時候適合用這個方法
大多數產品清單、桌位安排和活動跟蹤表本來就放在電子表格裡。如果團隊裡有人手動維護這份清單,從同一張表生成 QR Code,就能讓清單和 QR Code 保持同步,不需要開發人員參與。典型場景有:給每個產品 SKU 做一個用在包裝上的碼,給每張桌子或每個房間做一個碼,或者同一個活動給每個銷售代表、每個門店各做一個碼。
如果你需要在自己的應用裡生成 QR Code,就改從你的伺服器呼叫 API。這部分見 REST API 教程。
準備工作
- QR Maker 的 Business 版方案和一個 API 令牌。在「設定」的「API 令牌」裡建立。它以
qrs_開頭,只顯示一次。 - 一張 Google 表格,第 1 行是表頭,列依次為:A
external_id、Btarget_url、Cname(可選)、Dshort_link(留空)、Estatus(留空)。
external_id 是你給這一行定的編號:SKU、桌號、銷售代表編碼等。它在你的帳戶內必須唯一,可以包含字母、數字、點、下劃線、冒號和連字元。
第 1 步:新增指令碼
開啟表格,依次選擇「擴充套件程式」(Extensions)→「Apps 指令碼」(Apps Script),刪掉佔位程式碼,貼上 google-sheets.gs 的內容,然後儲存專案。
第 2 步:安全地儲存令牌
在 Apps Script 編輯器裡開啟「專案設定」(Project Settings),滾動到「指令碼屬性」(Script properties),新增一個名為 QR_TOKEN 的屬性,值填你的令牌。
不要把令牌貼上到單元格里。能開啟這張表的人都能讀到單元格內容,而任何拿到令牌的人都能在你的帳戶裡建立、修改和刪除 QR Code。指令碼屬性只有能編輯指令碼的人才看得到。
第 3 步:執行
重新整理表格,會出現一個新的「QR Maker」菜單。選擇「Create codes for new rows」(為新行建立 QR Code)。第一次執行時,Google 會請你授權指令碼編輯表格並呼叫外部服務。
對每一行有編號、有連結但還沒有短連結的資料,指令碼會建立一個動態碼並填好 D 列。E 列會顯示 created(已建立);如果之前已經用這個編號建過碼,顯示 already existed(已存在);如果這一行被拒絕,則顯示錯誤碼:連結不是有效的 http 或 https 地址時是 INVALID_TARGET_URL,目的地被安全檢查拒絕時(比如連結到另一個短網址服務)是以 URL_BLOCKED_ 開頭的錯誤碼。
第 4 步:獲取圖片
D 列的短連結,就是印刷出來的碼必須編碼的內容。至於圖片本身,有兩種方式:
- 從 QR Maker 的工作臺裡把每個碼下載為 SVG,在那裡還能套用你的配色和 Logo。
- 通過 API 呼叫
GET /v1/qrcodes/by-external-id/{external_id}?include=svg獲取,返回的碼在data.svg裡帶有 SVG 文本。Python 示例會為每一行儲存一個 SVG,幾百個碼時用它更快。
之後修改目的地
修改 B 列再執行一次指令碼,並不會改動已有的碼。這是有意設計的:用已知編號傳送一個不同連結的 POST 請求,會返回衝突,而不是悄悄改掉一個可能已經印刷出去的碼的跳轉。要改目的地,請在工作臺裡改,或者呼叫 PATCH /v1/qrcodes/by-external-id/{external_id} 並傳入新的 target_url。
需要注意的限制
每次執行每個請求最多傳送 100 行,每成功一行計一次呼叫,計入 Business 版每月包含的 50,000 次。失敗的行不計數。Apps Script 本身每次執行約 6 分鐘後會停止,足夠處理幾千行;更多的話,再執行一次,它會從停下的地方繼續。
常見問題
這樣做需要伺服器嗎?
不需要。Apps Script 執行在 Google 的伺服器上,所以令牌永遠不會到達瀏覽器。這也是為什麼儘管 API 不接受網頁發起的呼叫,這個方法依然可行。
只有檢視許可權的同事能看到我的令牌嗎?
不能。指令碼屬性只有能編輯指令碼專案的人才看得到。檢視者和評論者打不開它們。
如果我刪掉一行會怎樣?
碼不會受任何影響。刪除一行只是把它從表格裡去掉。如果這個碼應該停用,請在工作臺裡或通過 API 把它停用或刪除。