第 7 章

抓取成效數據與疑難排解

把每條帖的瀏覽、讚好、回覆數抓回試算表,以及最常見的出錯情況怎樣修。

系統已經會自動發帖。最後一步:把成效數據抓回試算表,讓你知道哪一種內容真的有人看。

1. 先加兩欄

Calendar 的標題列補上這幾欄(接在 Post URL 之後):

GHIJ
Post IDViewsLikesReplies

Post ID 是關鍵。 Threads 的成效查詢要用帖文的 media id,而永久連結推不回 media id——所以必須在發佈當下就記下來。

2. 修改發佈流程,記下 media id

publishRow_ 本來就有回傳 id,只是之前沒有寫進試算表。在 postSelectedRowrunScheduler 兩處,各加一行:

// postSelectedRow 裡,接在寫入 Post URL 之後:
sh.getRange(row, COL.POST_ID + 1).setValue(res.id);

// runScheduler 裡,接在寫入 Post URL 之後:
sh.getRange(r + 1, COL.POST_ID + 1).setValue(res.id);

並且更新欄位對照表:

var COL = {
  STATUS: 0, WHEN: 1, TEXT: 2, LINK: 3, POSTED: 4, URL: 5,
  POST_ID: 6, VIEWS: 7, LIKES: 8, REPLIES: 9,
};

只有這次改動之後發佈的帖才會有 Post ID。之前發的帖抓不到數據——除非你手動去補。

3. 加入成效程式碼

/* ========================= 成效數據 ========================= */

/**
 * 抓取每一行的成效數據。
 *
 * ⚠️ 查詢參數是 metric(單數)。用 metrics(複數)會直接被 API 拒絕,
 *    而且錯誤訊息是「The parameter metric is required.」,很容易被
 *    誤會成「沒有數據」。
 */
function refreshInsights() {
  var sh = sheet_();
  var data = sh.getDataRange().getValues();
  var token = token_();
  var updated = 0;
  var firstError = "";

  for (var r = 1; r < data.length; r++) {
    var id = String(data[r][COL.POST_ID] || "").trim();
    if (!id) continue;

    var res = UrlFetchApp.fetch(
      API + "/" + id + "/insights?metric=views,likes,replies" +
        "&access_token=" + encodeURIComponent(token),
      { muteHttpExceptions: true }
    );
    var body = res.getContentText() || "{}";
    var parsed = {};
    try { parsed = JSON.parse(body); } catch (err) { /* 交由下面處理 */ }

    if (!parsed.data) {
      if (!firstError) firstError = body.slice(0, 200);
      continue;
    }

    parsed.data.forEach(function (m) {
      // Threads 視乎指標,回傳 values[0].value 或 total_value.value
      var value = (m.values && m.values.length)
        ? m.values[0].value
        : (m.total_value ? m.total_value.value : null);
      if (value === null || value === undefined) return;

      var col = { views: COL.VIEWS, likes: COL.LIKES, replies: COL.REPLIES }[m.name];
      if (col !== undefined) sh.getRange(r + 1, col + 1).setValue(value);
    });
    updated++;
  }

  toast_(
    updated
      ? "已更新 " + updated + " 條的數據。"
      : "沒有數據可更新。" + (firstError ? " 錯誤:" + firstError : "")
  );
}

加進選單:

.addItem("更新成效數據", "refreshInsights")

4. 試一次

發一條新帖(這次會記下 Post ID),等幾分鐘讓數據累積,然後選 Threads → 更新成效數據

Views / Likes / Replies 應該會填上數字。

如果收到權限相關的錯誤,代表授權時沒有包含 threads_manage_insights。回第 2 章加入該權限,然後重新走一次「連接 Threads」。

5. 讓它自動更新(選用)

runScheduler 最後加一行,順便更新數據:

try { refreshInsights(); } catch (err) { Logger.log(err.message); }

疑難排解總表

現象最可能的原因怎樣修
授權頁說無法使用測試者邀請未接受第 2 章第 5 步,在 Threads 接受邀請
redirect_uri 不符Meta 登記的網址 ≠ /exec逐字比對;注意結尾斜線、/dev vs /exec
改了程式碼但行為沒變沒有重新部署編輯現有部署(不要新增),版本選「新版本」
重新部署後授權壞了你按了「新增部署作業」,網址變了用新網址更新 Meta,或改回編輯舊部署
到時間沒有發佈觸發器沒安裝Threads → 安裝自動排程;檢查 ⏰ 觸發條件
發佈時間差了幾小時試算表與指令碼時區不一致兩邊都設成同一時區
用了一兩個月後全部失敗權杖過期確認 runScheduler 有跑(續期在裡面);或重新連接
成效欄永遠空白用了 metrics 而不是 metric,或缺 insights 權限見上文
主帖出了、回覆連結沒有回覆失敗(刻意不影響主帖)看「執行項目」記錄
選單不見了onOpen 只在開檔時跑重新整理試算表

你做出了什麼

一套完整的 Threads 自動發帖系統:

  • 內容寫在你自己的試算表
  • 到時間自動發佈,主帖乾淨、連結在回覆
  • 權杖自己續期
  • 成效數據自動回填

沒有伺服器、沒有月費,權杖與內容都在你自己手上。

想做得更遠?

這套系統的天花板,是它只能發到你自己的帳戶——因為那是開發模式應用程式的限制(第 1 章講過)。

如果你的需求是替客戶管理多個帳戶,就要走 Meta App Review:商業驗證、示範錄影、隱私政策、資料刪除端點,審核往往需時數週。那是另一個量級的工程。

我們把這條路走完了。Heion Social 是我們做的託管版本:已通過審核、多帳戶、內容庫加審批流程,連接帳戶只需要按一下,不需要碰開發者後台。

如果你只是想幫自己或自己公司省下每天出帖的工序,你剛剛做的這套已經完全夠用——那正是我們自己在用的東西。

有做不通的地方,或者想我們幫你搭一套,歡迎聯絡

步驟最後驗證於 2026年7月19日