2026年7月10日 星期五

文章標題建議:【No-Code 實戰】AppSheet 掃描 ISBN 自動帶入書名:避開 Google Books API 的三大深坑

 







前言

介紹為何選擇 AppSheet(開發快、行動端支援強)以及為何需要搭配 Google Apps Script (GAS) 呼叫 Google Books API。


技術架構

  1. AppSheet: 負責掃描條碼(ISBN)並觸發自動化。

  2. Google Apps Script (GAS): 作為中繼站,接收 ISBN、向 Google API 請求資料,並處理回傳格式。

  3. Google Books API: 資料來源。


重難點解析(這部分是 Blog 的精華)

坑一:地理位置限制造成的 403 錯誤

  • 問題現象:同一串 URL 在瀏覽器直接打開看得到資料,但在 GAS 執行時卻噴出 403 Forbidden,錯誤訊息為 "Cannot determine user location for geographically restricted operation"

  • 原因:Google 伺服器發出請求時沒有固定地理位置,而部分書籍(尤其是繁中書)有區域版權限制。

  • 解決方法:在 API 請求網址後方加上 &country=TW(或所在地代碼),強制指定查詢區域。

坑二:AppSheet 類型轉換失敗 (Schema Translation Error)

  • 問題現象Failed App Script type translation: Schema has more than one column but no object was returned

  • 原因:你在 AppSheet 設定了要接收一個「物件 (Object)」,但你的 GAS 卻回傳了單純的「字串」或格式不符。

  • 解決方法:確保 GAS 最後的 return 是一個用大括號 {} 包起來的 JSON 物件,且名稱(Key)必須與 AppSheet 的 Specific type 設定完全一致。

坑三:找不到腳本專案 (Invalid Argument)

  • 問題現象:在 AppSheet 選取 GAS 檔案時出現 INVALID_ARGUMENT 或找不到函數。

  • 原因:Google 帳號預設關閉了外部 API 存取腳本的權限。

  • 解決方法:前往 Google Apps Script Settings「Google Apps Script API」 設定為 ON

坑四:ISBN 格式不統一

  • 問題現象:掃描出來的 ISBN 有時帶橫線(978-626...),導致 API 搜尋失敗。

  • 解決方法:在 GAS 中使用正規表示式 replace(/\D/g, "") 先將輸入內容純化為數字。


最終完美版程式碼

你可以把這段程式碼貼在 Blog 供人複製:

JavaScript
/**
 * 由 AppSheet 觸發,根據 ISBN 取得書籍資訊
 * 解決了地理位置限制 (403) 與 格式轉換問題
 */
function getBookDetails(isbn) {
  // 初始化回傳物件,確保格式永遠一致
  var result = {
    "title": "查無資料",
    "authors": "",
    "image": ""
  };

  if (!isbn) return result;

  // 1. 清除非數字字元(去掉橫線與空白)
  var cleanIsbn = isbn.toString().replace(/\D/g, "").trim();

  // 2. 設定 API Key 與網址,關鍵在於加上 &country=TW
  const apiKey = "你的_API_KEY"; 
  const url = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + cleanIsbn + "&key=" + apiKey + "&country=TW";
  
  try {
    const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
    const data = JSON.parse(response.getContentText());

    if (data.totalItems > 0) {
      const book = data.items[0].volumeInfo;
      result.title = book.title || "未知書名";
      result.authors = book.authors ? book.authors.join(", ") : "未知作者";
      result.image = book.imageLinks ? book.imageLinks.thumbnail : "";
    } else {
      result.title = "Google 資料庫查無此書 (" + cleanIsbn + ")";
    }
  } catch (e) {
    result.title = "系統執行出錯: " + e.message;
  }

  return result;
}

結語

寫 Blog 時可以提到:這不只是一個書庫 App,同樣的邏輯可以應用在「掃描藥品外盒」、「掃描零件序號」等各種自動化場景。只要解決了 API 限制與資料格式對接,AppSheet 的潛力非常巨大。

如果要寫在 Blog 裡,關於「開啟 API」與「建立腳本」的正確引導應該如下:


如何正確建立與授權腳本?(Blog 更新建議)

1. 使用 script.new 建立獨立腳本 (Standalone Script)

不要從 Google 試算表的「擴充功能」進入,因為那樣建立的是「容器綁定腳本 (Bound Script)」,有時 AppSheet 搜尋起來較困難。

  • 正確做法:在瀏覽器輸入 script.new。這會直接幫你建立一個獨立的 Apps Script 專案。這對 AppSheet 來說最容易找到,且管理最方便。

2. 開啟 Google Apps Script API 權限

這是 AppSheet 能否「看見」你腳本的關鍵開關。如果上面的連結失效,請帶領讀者這樣操作:

  1. 進入 Google Apps Script 首頁

  2. 點擊左側選單最下方的 「設定」(Settings)(圖示是一個齒輪 ⚙️)。

  3. 找到 「Google Apps Script API」 區塊。

  4. 將開關切換為 「開啟」(ON)

    • 註:如果這裡沒開啟,AppSheet 在選取檔案時會出現 


為什麼推薦使用 script.new

在 Blog 中可以補充這個技術細節:

  • 搜尋效率:AppSheet 的檔案選擇器對於「獨立腳本」的搜尋支援度更高。

  • 權限獨立:獨立腳本不依賴特定試算表,如果你以後想把這個書庫功能移到別的 App 或別的表格,腳本不需要重新搬家。

整理後的 Blog 偵錯章節:

「明明寫了腳本,AppSheet 卻找不到?」

  1. 請確保你是透過 script.new 建立的「獨立專案」。

  2. 檢查 Google Apps Script 設定頁面,確認 API 開關已開啟。

  3. 務必點擊腳本編輯器上方的「儲存」磁碟圖示。

沒有留言:

張貼留言

文章標題建議:【No-Code 實戰】AppSheet 掃描 ISBN 自動帶入書名:避開 Google Books API 的三大深坑

  前言 介紹為何選擇 AppSheet(開發快、行動端支援強)以及為何需要搭配 Google Apps Script (GAS) 呼叫 Google Books API。 技術架構 AppSheet : 負責掃描條碼(ISBN)並觸發自動化。 Google Apps Scrip...