Google Apps Script网页抓取数值后条件判断失效排查
问题排查与修复方案
嘿,我一眼就揪出了核心问题——你的条件判断完全成了“摆设”,根本没和createBackupFile的执行逻辑绑定,这就是为啥不管数值范围怎么设,函数都会无条件跑的原因!咱们一步步拆解修复:
1. 最致命的错误:条件判断未生效
你看createBackup函数里这段代码:
console.log(scraped,parseInt(scraped) > 0 && parseInt(scraped) < 863); { createBackupFile(folder, FILE_NAME, fetchData()); }
这里的{}只是个普通代码块,完全不受前面的条件判断影响!不管console.log里的布尔值是true还是false,这个代码块里的函数都会执行。相当于你只是打印了条件结果,但根本没让代码“根据条件决定要不要执行”。
修复方法:用if包裹执行逻辑
把代码改成这样,让createBackupFile只在满足条件时触发:
const scrapedNum = parseInt(scraped, 10); // 加第二个参数10避免进制问题 const shouldRunBackup = scrapedNum > 0 && scrapedNum < 863; console.log(scraped, shouldRunBackup); // 关键:用if把执行逻辑和条件绑定 if (shouldRunBackup) { createBackupFile(folder, FILE_NAME, fetchData()); }
2. 隐藏的小错误:fetchData里的未定义变量
你的fetchData最后一行写了return folder.createFile(blob);,但folder这个变量在fetchData里根本没定义!这会导致脚本报错,咱们把它改成只返回blob,让createBackupFile负责创建文件:
function fetchData() { var exportUrl = RESOURCE_URL; var response = UrlFetchApp.fetch(exportUrl); var htmlBody = response.getContentText(); // 只返回处理好的blob,不负责创建文件 return Utilities.newBlob(htmlBody, 'text/html') .getAs('application/pdf') .setName(FILE_NAME); }
然后给createBackupFile补上创建文件的逻辑:
function createBackupFile(folder, filename, data, overwrite) { if (overwrite) { var existingFiles = folder.getFilesByName(filename); while (existingFiles.hasNext()) { var file = existingFiles.next(); folder.removeFile(file); } } // 新增:用传入的folder创建文件 folder.createFile(data); }
3. 正则表达式的潜在坑(可选优化)
你正则里写的是<和>,但实际抓取的htmlBody里大概率是真实的<和>符号(因为UrlFetchApp.fetch返回的是解码后的HTML)。如果网页源码里是<span>而不是<span>,你的正则就匹配不到数值。可以把正则改成:
var scrapedMatch = htmlBody.match(/Loyalty cijena<\/span>\s*<strong>(\d+),(\d+) KN<\/strong>/m);
另外建议加个匹配失败的容错,避免网页结构变化导致脚本崩溃:
// 先检查是否匹配成功 if (!scrapedMatch) { console.log("没找到目标价格,脚本终止"); return; } const scraped = scrapedMatch[1];
修复后的完整createBackup函数
function createBackup() { var folder = getFolder(FOLDER_NAME); var exportUrl = RESOURCE_URL; var response = UrlFetchApp.fetch(exportUrl); var htmlBody = response.getContentText(); // 修正正则并增加容错 var scrapedMatch = htmlBody.match(/Loyalty cijena<\/span>\s*<strong>(\d+),(\d+) KN<\/strong>/m); if (!scrapedMatch) { console.log("未匹配到目标价格"); return; } const scraped = scrapedMatch[1]; const scrapedNum = parseInt(scraped, 10); const shouldRunBackup = scrapedNum > 0 && scrapedNum < 863; console.log(scraped, shouldRunBackup); // 条件满足才执行备份 if (shouldRunBackup) { createBackupFile(folder, FILE_NAME, fetchData()); } }
额外小建议
- 把重复调用的
UrlFetchApp.fetch(exportUrl)抽成单独函数,减少代码冗余 - 可以给
createBackupFile的overwrite参数加默认值,比如overwrite = false,避免调用时遗漏参数
内容的提问来源于stack exchange,提问作者user3316048
相关产品推荐
相关产品推荐

