使用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"] - 对每一行数据:
- 用正则拆分团队名称和数字部分(团队名是前面的非数字内容,后面是所有带逗号的数字)
- 拆分数字并去除逗号,转换为数值类型
- 根据数字数量填充四列:
- 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
相关产品推荐
相关产品推荐

