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

Google Apps Script技术求助:从Google Drive中PDF文件提取USD旁数值并写入Google表格

问题分析与解决方案

先梳理下你的代码里几个核心问题:

  1. 正则匹配逻辑错误:你用findText("(USD)")是在找带括号的(USD)文本,但实际PDF里应该是USD本身;而且你需要提取它紧邻的数值,得用能捕获数值的正则表达式,而不是单纯匹配USD文本。
  2. 循环逻辑缺失:你的while循环没有推进到下一个匹配项,会一直卡在第一个匹配上陷入死循环,也没有提取数值的具体逻辑。
  3. 缺少表格写入逻辑:代码完全没有实现把提取到的数值写入Google表格的部分。
  4. 临时资源未清理:通过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和文件名放在代码开头,方便你快速修改。

前置准备

  1. 启用Advanced Drive API:在Google Apps Script编辑器顶部点击资源→高级Google服务,找到Drive API并开启,保存设置。
  2. 授权权限:第一次运行脚本时会提示授权,按照页面指引完成权限授予即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:47:53