如何用Google Apps Script从Gmail提取多跟踪号数据匹配填充Google Sheets
问题背景
现有场景为单封Gmail邮件包含多个快递跟踪号,标准邮件内容示例如下:
Your order is ready to be redeemed/ delivered. Order No. 91401111 Tracking No. (Actual Weight/Chargeable Weight) JK5SD8F4M6 (2.1lb) J6HDO9L665 (2.1lb) J3SDG76435 (9.8lb) Courier UPS Shipment No. 23879924905
需求为提取邮件内的订单号、所有跟踪号及对应重量、快递公司、Shipment No,匹配Google Sheets中Sheet1的A列跟踪号,填充对应列数据,无匹配行则新增行。
原有脚本存在两个缺陷:
- 缺少提取对应重量的正则表达式
- 无法识别单封邮件内的多个跟踪号,仅能处理第一个跟踪号
修复后完整代码
function extractDetails(message){ const emailBody = message.getPlainBody(); // 提取邮件内公共字段(单封邮件内统一) const orderNo = emailBody.match(/(?<=Order No\. )\d+/)[0].trim(); const courier = emailBody.match(/(?<=Courier )[A-Za-z]+/)[0].trim(); const shipmentNo = emailBody.match(/(?<=Shipment No\. )\d+/)[0].trim(); // 全局匹配所有跟踪号+重量组合 const trackingReg = /([A-Z0-9]+)\s*\(([\d.]+lb)\)/g; const trackingList = []; let matchResult; // 遍历所有匹配结果存入数组 while ((matchResult = trackingReg.exec(emailBody)) !== null) { trackingList.push({ no: matchResult[1], weight: matchResult[2] }) } const activeSheet = SpreadsheetApp.getActiveSpreadsheet(); const sheet = activeSheet.getSheetByName('Sheet1'); // 循环处理每个跟踪号 trackingList.forEach(item => { const range = sheet.getRange("A2:A" + sheet.getLastRow()).createTextFinder(item.no).matchEntireCell(true).findNext(); if (range) { // 匹配到则更新对应列 range.offset(0, 3).setValue(item.weight); range.offset(0, 4).setValue(orderNo); range.offset(0, 5).setValue(courier); range.offset(0, 6).setValue(shipmentNo); } else { // 未匹配到则新增行 sheet.appendRow([item.no, '', '', item.weight, orderNo, courier, shipmentNo]); } }) }
关键修改说明
- 重量提取:使用带分组的全局正则
/([A-Z0-9]+)\s*\(([\d.]+lb)\)/g,一次匹配即可同时拿到跟踪号和对应重量,分组1为跟踪号,分组2为重量 - 多跟踪号处理:通过
while循环遍历全局正则的所有匹配结果,将所有跟踪号和对应重量存入数组后循环处理 - 匹配优化:
createTextFinder增加matchEntireCell(true)配置,避免部分字符匹配导致的错误填充
内容的提问来源于stack exchange,提问作者Masterkenobi
相关产品推荐
相关产品推荐

