Google Apps Script技术求助:从Google Drive中PDF文件提取USD旁数值并写入Google表格
问题分析与解决方案
先梳理下你的代码里几个核心问题:
- 正则匹配逻辑错误:你用
findText("(USD)")是在找带括号的(USD)文本,但实际PDF里应该是USD本身;而且你需要提取它紧邻的数值,得用能捕获数值的正则表达式,而不是单纯匹配USD文本。 - 循环逻辑缺失:你的while循环没有推进到下一个匹配项,会一直卡在第一个匹配上陷入死循环,也没有提取数值的具体逻辑。
- 缺少表格写入逻辑:代码完全没有实现把提取到的数值写入Google表格的部分。
- 临时资源未清理:通过Drive API生成的OCR临时文档如果不删除,会一直占用Drive空间。
修正后的完整代码
下面是修复后的代码,包含数值提取和写入Google表格的完整功能:
function extractUSDValueAndWriteToSheet() { // 配置参数:替换成你的实际信息 const FOLDER_ID = '你的文件夹ID'; const PDF_FILE_NAME = '08-Sep-2021.pdf'; const SHEET_ID = '你的Google表格ID'; const TARGET_CELL = 'A1'; // 数值要写入的单元格位置 try { // 1. 获取目标PDF文件 const drive = DriveApp; const folder = drive.getFolderById(FOLDER_ID); const pdfFiles = folder.getFilesByName(PDF_FILE_NAME); if (!pdfFiles.hasNext()) { throw new Error(`找不到名为${PDF_FILE_NAME}的文件`); } const pdfBlob = pdfFiles.next().getBlob(); // 2. 通过Drive API将PDF转为带OCR的临时文档 const resource = { title: `临时OCR_${PDF_FILE_NAME}`, mimeType: pdfBlob.getContentType() }; // 需提前启用Advanced Drive API才能使用Drive.Files.insert const tempDoc = Drive.Files.insert(resource, pdfBlob, {ocr: true, ocrLanguage: "en"}); // 3. 提取文档文本 const doc = DocumentApp.openById(tempDoc.id); const fullText = doc.getBody().getText(); doc.saveAndClose(); // 4. 正则匹配提取USD紧邻的数值 // 假设格式为「数值 + 空格 + USD」(如"167.1764 USD") // 若数值在USD后,改为 /USD\s*(\d+\.\d+)/g const regex = /(\d+\.\d+)\s*USD/g; let match; const usdValues = []; while ((match = regex.exec(fullText)) !== null) { const num = parseFloat(match[1]); usdValues.push(num); Logger.log(`提取到USD数值:${num}`); } if (usdValues.length === 0) { throw new Error("未找到与USD关联的数值"); } // 5. 将第一个匹配的数值写入Google表格 const sheet = SpreadsheetApp.openById(SHEET_ID).getActiveSheet(); sheet.getRange(TARGET_CELL).setValue(usdValues[0]); Logger.log(`成功将数值${usdValues[0]}写入表格`); } catch (error) { Logger.log(`执行出错:${error.message}`); } finally { // 6. 清理临时文档(无论成败都删除) if (typeof tempDoc !== 'undefined') { drive.getFileById(tempDoc.id).setTrashed(true); } } }
关键修改说明
- 正则表达式优化:用
/(\d+\.\d+)\s*USD/g匹配「数值+可选空格+USD」的格式,捕获组match[1]就是目标数值;如果你的PDF里是USD 167.1764格式,把正则改成/USD\s*(\d+\.\d+)/g即可。 - 循环提取所有匹配项:通过
regex.exec()遍历所有符合条件的数值,存入数组方便后续批量处理(如果有多个USD数值的话)。 - 表格写入逻辑:通过
SpreadsheetApp打开目标表格,将提取到的数值写入指定单元格。 - 错误处理与资源清理:加入try-catch-finally块,确保出错时能明确提示原因,且无论执行成败都会删除临时生成的OCR文档,避免Drive空间浪费。
- 参数集中配置:把需要替换的ID和文件名放在代码开头,方便你快速修改。
前置准备
- 启用Advanced Drive API:在Google Apps Script编辑器顶部点击
资源→高级Google服务,找到Drive API并开启,保存设置。 - 授权权限:第一次运行脚本时会提示授权,按照页面指引完成权限授予即可。
内容的提问来源于stack exchange,提问作者Mehdi Abbas
相关产品推荐
相关产品推荐

