iT邦幫忙

0

【kintone】欄位值變動時發通知提醒

  • 分享至 

  • xImage
  •  

在 kintone 應用程式中,其實已經內建相當完整的「通知」機制。
透過「記錄的通知條件」,我們可以設定:當某個欄位的值符合指定條件時,通知特定人員

但在實務上,常會遇到一個落差:

  • 通知條件只能「比較現在的值是否符合條件」
  • 無法直接判斷「欄位的值是否被變更過」
  • 即使使用「記錄被編輯時通知」,也只能知道「有編輯」,而不知道是哪個欄位被改了

在以下這類場景中,就會顯得有些不夠用:

  • 報價金額被調整
  • 負責人/關聯人員被更換
  • 重要狀態被人悄悄修改

本文將介紹如何透過簡單的客製化程式碼,搭配「記錄的通知條件」,來實現「欄位值變動時通知」的效果。

核心思路說明

關鍵觀念只有一個:

通知條件只能判斷「欄位目前的值」,
那我們就自己準備一個「變動旗標欄位」,在有變動時讓它「從不符合 → 符合」。

實作步驟大致如下:

  1. 新增一個「數值欄位」作為變動旗標
  2. 編輯記錄時,比較「編輯前」與「現在」的值
  3. 若有變動,設定旗標欄位為非 0
  4. 利用「記錄的通知條件」判斷旗標欄位
  5. 通知發送後,再把旗標欄位歸零(為了下次能再次觸發)

接下來用兩個實際案例來說明。

範例一:金額變動時發送通知

需求情境

  • 當「金額」被修改時,通知相關人員
  • 不在意調整多少,只要有變動就通知

步驟一:新增變動旗標欄位

在應用程式中新增一個數值欄位:

  • 欄位名稱:金額變動
  • 預設值:0
  • 用途:儲存「新金額 - 舊金額」

步驟二:設定記錄的通知條件

在「記錄的通知條件」中設定:

  • 條件:金額變動 ≠(不等於)0
  • 通知對象:依需求指定

步驟三:客製化程式碼

(() => {
  'use strict'

  // 編輯送出前:計算金額差異
  kintone.events.on(['app.record.edit.submit'], async event => {
    try {
      const record = event.record
      const amount = Number(record['金額'].value)

      // 取得編輯前的記錄資料
      const kres = await kintone.api(
        kintone.api.url('/k/v1/record'),
        'GET',
        {
          app: kintone.app.getId(),
          id: record.$id.value
        }
      )

      const previousAmount = Number(kres.record['金額'].value)

      // 將差額存入變動欄位
      record['金額變動'].value = amount - previousAmount

    } catch (error) {
      window.alert(error.message)
      console.error(error)
    }

    return event
  })

  // 編輯成功後:將變動欄位歸零
  kintone.events.on(['app.record.edit.submit.success'], async event => {
    try {
      await kintone.api(
        kintone.api.url('/k/v1/record'),
        'PUT',
        {
          app: kintone.app.getId(),
          id: event.record.$id.value,
          record: {
            金額變動: { value: 0 }
          }
        }
      )
    } catch (error) {
      window.alert(error.message)
      console.error(error)
    }

    return event
  })
})()

為什麼需要將變動欄位歸零?

kintone 的通知邏輯是:

只有在「條件從不符合 → 符合」時,才會發送通知

如果「金額變動」一直維持非 0:

  • 第一次會通知
  • 之後再怎麼改金額,都不會再通知

因此,在通知送出後主動歸零,是這個做法能反覆運作的關鍵。

範例二:關聯人員變動時發送通知

需求情境

  • 欄位類型:選擇使用者
  • 當關聯人員名單有任何變動(新增、移除、替換)時通知

設計重點

  • 選擇使用者的值是「陣列」
  • 不能單純比對長度,還要比對使用者 code
  • 只要前後內容不同,就視為「有變動」

客製化程式碼

(() => {
  'use strict'

  kintone.events.on(['app.record.edit.submit'], async event => {
    try {
      const record = event.record
      const users = record['關聯人員'].value

      // 取得編輯前的記錄
      const kres = await kintone.api(
        kintone.api.url('/k/v1/record'),
        'GET',
        {
          app: kintone.app.getId(),
          id: record.$id.value
        }
      )

      const previousUsers = kres.record['關聯人員'].value

      let usersChanged = 0

      if (users.length !== previousUsers.length) {
        usersChanged = 1
      } else {
        const previousUserIds = previousUsers.map(u => u.code)
        for (const user of users) {
          if (!previousUserIds.includes(user.code)) {
            usersChanged = 1
            break
          }
        }
      }

      record['關聯人員變動'].value = usersChanged

    } catch (error) {
      window.alert(error.message)
      console.error(error)
    }

    return event
  })

  kintone.events.on(['app.record.edit.submit.success'], async event => {
    if (Number(event.record['關聯人員變動'].value) === 0) {
      return event
    }

    try {
      await kintone.api(
        kintone.api.url('/k/v1/record'),
        'PUT',
        {
          app: kintone.app.getId(),
          id: event.record.$id.value,
          record: {
            關聯人員變動: { value: 0 }
          }
        }
      )
    } catch (error) {
      window.alert(error.message)
      console.error(error)
    }

    return event
  })
})()

變動判斷邏輯說明

  1. 先比較前後陣列長度
    • 若長度不同,代表有人員被新增或移除
    • 此情況下可以直接判定為「已變動」
  2. 長度相同時,再比較人員內容
    • 取出編輯前的人員 code 清單
    • 檢查目前選擇的人員是否全部存在於編輯前清單中
    • 只要有任一人員不在,即視為「已變動」

此做法的特性是:

  • 相同人員、不同順序 → 不視為變動
  • 適合「只在意人員是否有增減或替換」的使用情境

如果你的業務邏輯中,人員的順序本身就具有意義(例如第一順位負責人、第二順位備援人員),
則可以改為直接比對整個陣列內容與順序,而不採用此種「忽略順序」的判斷方式。

溫馨提醒

⚠️ 操作者本人不會收到通知

這是 kintone 原本的通知設計邏輯:

「自己做的操作,自己已經知道了,不需要再通知一次」

因此在開發與測試時,請務必注意:

  • 如果通知對象是 Administrator
  • 而你又是用 Administrator 編輯記錄
  • 👉 是不會收到任何通知的

建議測試方式:

  • 使用 A 帳號編輯
  • 通知設定給 B 帳號
  • 才能正確確認功能是否正常運作

結語

透過以上做法,我們僅需透過少量前端程式碼,即可活用 kintone 本身的通知機能,同時實現更精細的「欄位值變動通知」。
如果公司內部常有這類的使用場景,甚至可以考慮將功能外掛化,更方便重複利用與設定。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言