You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Apps Script解析银行交易邮件并拆分字段写入Google Spreadsheet

银行通知邮件字段提取写入Google Spreadsheet解决方案

核心问题

原有代码通过正则拆分后得到的是无对应关系的一维数组,没有做字段和值的绑定,缺字段或者字段顺序变动就会出现列错位,也没有按需求的列规则拼接写入逻辑。

调整后可直接运行的代码

// 先定义所有要提取的字段名,和邮件正文里的字段名完全一致即可
const ALL_FIELDS = [
  'Branch Code',
  'Branch Name',
  'Slip No',
  'BL Number',
  'Type Of Payment',
  'Customer Name',
  'Payer Bank',
  'Payer Bank Branch',
  'Transaction Type',
  'Amount',
  'Posting Date',
  'Value Date'
]

// 重写解析函数,返回字段名对应字段值的键值对
function parseEmail(message) {
  const fieldResult = {}
  // 先把换行替换为临时分隔符,避免跨行内容丢失
  const text = message.replace(/\r?\n/g, '$$$')
  ALL_FIELDS.forEach(field => {
    // 匹配当前字段到下一个字段之间的内容作为值
    const matchRule = new RegExp(`${field}\\s*:?\\s*(.+?)(?=${ALL_FIELDS.join('|')}|$)`)
    const matchRes = text.match(matchRule)
    fieldResult[field] = matchRes ? matchRes[1].replace(/\$\$\$/g, ' ').trim() : ''
  })
  return fieldResult
}

// 重写主函数
function importBankEmailToSheet(){
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = ss.getSheetByName("Emails")
  const lastScanDate = sheet.getRange("Z3").getValue()
  // 把query里的主题关键词替换成你实际的银行邮件主题
  const searchQuery = `subject: 银行交易通知, after:${Math.floor(lastScanDate.getTime()/1000)}`
  const threads = GmailApp.search(searchQuery)
  const writeRows = []

  // 遍历所有匹配邮件
  threads.forEach(thread => {
    const msgList = thread.getMessages()
    const latestMsg = msgList[msgList.length - 1]
    const plainText = latestMsg.getPlainBody()
    const parsed = parseEmail(plainText)
    // 按你要求的列规则拼接行:A列存Branch Code值、B列存Branch Code字段名、C列存Slip No值,后续可自行调整顺序
    const row = [
      parsed['Branch Code'],
      'Branch Code',
      parsed['Slip No'],
      parsed['Branch Name'],
      parsed['BL Number'],
      parsed['Type Of Payment'],
      parsed['Customer Name'],
      parsed['Payer Bank'],
      parsed['Payer Bank Branch'],
      parsed['Transaction Type'],
      parsed['Amount'],
      parsed['Posting Date'],
      parsed['Value Date']
    ]
    writeRows.push(row)
  })

  // 批量写入到表格最后一行,比逐行写入效率更高
  if(writeRows.length > 0) {
    const lastRow = sheet.getLastRow()
    sheet.getRange(lastRow + 1, 1, writeRows.length, writeRows[0].length).setValues(writeRows)
    // 更新最后扫描时间
    sheet.getRange("Z3").setValue(threads[0].getLastMessageDate())
  }
}

注意事项

  • 代码里ALL_FIELDS可以根据你实际的邮件字段增删,只要和邮件正文里的字段名完全匹配即可
  • 拼接row数组的顺序可以自由调整,对应你要写入的表格列顺序就行
  • 搜索邮件的query里的主题关键词要替换成你实际收到的银行邮件的主题特征,避免匹配到无关邮件

内容的提问来源于stack exchange,提问作者Mehdi Abbas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:21:01