使用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
相关产品推荐
相关产品推荐

