iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
生成式 AI

打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!系列 第 25

【Day 24】主題選單功能(二)— 主題點擊追蹤,更新試算表資料

  • 分享至 

  • xImage
  •  

昨天我們新增了試算表 sheet2 的欄位,並輸入預設值:三個主題點擊次數皆為 0。
接下來就要取得試算表資料,所以我們先在昨天最後一個節點:Google Sheets 節點後面再新增一個相同的節點,功能改成:「Get row(s) in sheet」。

取得 rows

https://ithelp.ithome.com.tw/upload/images/20250927/20178067sJRgfzHGdH.png

  • Filters 指定要篩選的欄位:userId
  • 指定要比對的值:{{$json.userId}}
  • 確保工作流只會讀取或更新特定使用者的資料,不會動到其他資料。

取得試算表資料後,我們要用一個 Code 節點來更新使用者點擊主題選單的次數。

更新點擊次數

Get row(s) in sheet 節點後新增 Code 節點,輸入以下程式碼:

const inputs = $input.all();
const menuTopicEN = inputs[inputs.length - 1].json.menuTopicEN;
const row = inputs[0].json;

// 確保使用者選擇的欄位有值,沒有就預設為 0
let current = row[menuTopicEN] || 0;

// 如果 current 不是數字,將其轉為數字
if (isNaN(current)) {
    current = parseInt(current, 10) || 0;
}

// 根據使用者選擇的主題,將欄位值 +1
row[menuTopicEN] = current + 1;

return $input.all();

雖然我在前兩篇文章說到我要改這個主題選單功能的內容,但我後來努力嘗試,終於找到了可以讓對應主題做正確更新的辦法,於是這篇文章就是回歸最原本的計畫了。

程式碼說明

  1. 取得前面所有從節點輸入的資料,同時存取 Google Sheets 節點和 LINE Webhook 節點的資料,避免後續需要用到的資料流失,
  2. inputs 陣列中,取得最後一個資料項目,並從中提取 menuTopicEN
  3. inputs 陣列中,取得第一個資料項目,並將其賦予給 row 變數。
    ( Google Sheets 節點的資料被放在最前面)
    https://ithelp.ithome.com.tw/upload/images/20250927/20178067Mj8xrc4q0y.png
    其餘內容請看程式碼註解~

使用者可能會點選很多次主題選單,我們要找出最新一筆使用者的點擊紀錄,並將所有相關的資訊整合後回傳

最新點擊

在剛剛的 Code 節點後新增另一個 Code 節點,輸入以下程式碼:

const inputs = $input.all();
const row = inputs[0].json;
const userId = inputs[0].json.userId;
const menuTopicEN = inputs[0].json.menuTopicEN;

let maxRowNumber = -1;
let lastClickedItem = {};

// 遍歷所有輸入資料項目,找到 row_number 最大的那一個
for (const item of inputs) {
    const currentRowNumber = item.json.row_number;

    // 如果目前的 row_number 更大,就將整個 item 儲存起來
    if (currentRowNumber > maxRowNumber) {
        maxRowNumber = currentRowNumber;
        lastClickedItem = item.json;
    }
}

// 最後一次點擊的主題轉換成英文
const lastTopicEN = lastClickedItem.menuTopicEN;
let lastTopicCN;
switch(lastTopicEN){
    case "intworld": lastTopicCN = "國際"; break;
    case "technology": lastTopicCN = "科技"; break;
    case "stars": lastTopicCN = "娛樂"; break;
}

return {
    json: {
        userId,
        lastTopicCN,
        menuTopicEN,
        intworld: row.intworld,
        technology: row.technology,
        stars: row.stars
    }
};

程式碼解釋

  1. 找出最新點擊:遍歷所有資料,找出 row_number 最大的那筆,因為這代表最新的資料。
  2. 轉換主題:將最新點擊的英文主題轉換成中文。
  3. 整合回傳:將所有從不同來源(最新的點擊紀錄、試算表資料)中提取的資訊,打包成一個單一的 JSON 物件後回傳。

找到最新的點擊之後,我們要對試算表進行更新。

更新 sheet2 欄位

在剛剛的 Code 節點後新增一個 Update row in sheet 節點。

https://ithelp.ithome.com.tw/upload/images/20250927/20178067kuH8qI2Pgg.png
https://ithelp.ithome.com.tw/upload/images/20250927/20178067RYN2w7SLrI.png

下方傳送的是我們要更新的欄位,使用者輸入的主題和三種主題的點擊次數都要做更新。

今天把最重要的「點擊次數更新」部分做完了,我一次次嘗試,執行了好多次工作流,想了好多條可能可行的路,終於迎來成功了!

試算表畫面

試算表在使用者一次次點擊時更新的結果會像這樣:
https://ithelp.ithome.com.tw/upload/images/20250927/20178067ExXtnMpOFY.png
更新的次數都在第一列。

下篇預告

明天「Day 25」我們將進入另一個需要邏輯分析的部分,完成使用者點擊選單的次數超過上限的對策。


上一篇
【Day 23】主題選單功能(一)— 基礎工作流設定與資料準備
下一篇
【Day 25】主題選單功能(三)— 判斷條件搞清楚執行流程
系列文
打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言