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

使用Apps Script提取PDF表格并写入Google Sheets的问题

问题解决:PDF表格文本转Google Sheets规范数组及写入错误修复

1. 写入错误的直接原因

你遇到的TypeError: sheet.getrange is not a function是方法名拼写错误:

  • Google Apps Script中,获取单元格范围的方法是getRange(驼峰命名,首字母大写),不是getrange
  • 同理,写入值的方法是setValues,不是setvalues

2. 文本转规范四列数组的处理逻辑

原始提取的文本存在两个问题:团队名称可能包含空格(比如Team A)、数字列数量不一致(部分行2个数字,部分3个),需要统一处理为Teams、X、Y、Total四列:

处理步骤:

  • 过滤提取文本中的空行,避免无效数据
  • 将第一行的"Groups"替换为表头["Teams", "X", "Y", "Total"]
  • 对每一行数据:
    1. 用正则拆分团队名称和数字部分(团队名是前面的非数字内容,后面是所有带逗号的数字)
    2. 拆分数字并去除逗号,转换为数值类型
    3. 根据数字数量填充四列:
      • 2个数字:X=第一个数字,Y留空,Total=第二个数字
      • 3个数字:X=第一个,Y=第二个,Total=第三个

3. 修改后的完整脚本

function importPDFFromGmail() {
  var threads = GmailApp.search("TEST PDF PULL"); 
  var messages = threads[0].getMessages();
  var message = messages[messages.length - 1];  
  var attachment = message.getAttachments()[0];  

  attachment.setContentTypeFromExtension();
  if (attachment.getContentType() === "application/pdf") {
    var sheet = SpreadsheetApp.openById('<Sheet ID>').getSheetByName('PDF TEST');
    var blob = attachment.getAs(MimeType.PDF);  
    var filetext = pdfToText(blob, {keepTextfile: false});
    var extract = filetext.split('Sum')[1].split('Sum')[0]; 
    
    var lines = extract.split("\n")
      .filter(line => line.trim() !== ""); // 过滤空行
    
    // 转换为规范四列数组
    var data = lines.map((line, index) => {
      if (index === 0) {
        // 替换表头
        return ["Teams", "X", "Y", "Total"];
      }
      // 正则拆分团队名和数字部分
      const match = line.match(/^(.*?)\s+((?:\d+,?\d+\s*)+)$/);
      if (!match) return [];
      
      const teamName = match[1].trim();
      const numberStrings = match[2].trim().split(/\s+/).filter(str => str !== "");
      // 去除逗号并转数字
      const numbers = numberStrings.map(numStr => Number(numStr.replace(/,/g, "")));
      
      // 填充四列
      switch(numbers.length) {
        case 2:
          return [teamName, numbers[0], "", numbers[1]];
        case 3:
          return [teamName, numbers[0], numbers[1], numbers[2]];
        default:
          return [teamName, "", "", ""]; // 处理异常行
      }
    });
    
    sheet.clear();
    // 修正后的getRange和setValues
    sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
  }
};

额外说明

  • 若pdfToText是自定义函数,确保其能正确提取PDF文本,无乱码或格式错乱
  • 写入的数字会自动转为Google Sheets的数值格式,方便后续计算
  • 若团队名称有特殊格式,可调整正则表达式^(.*?)\s+((?:\d+,?\d+\s*)+)$适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:55:19