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

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. 正则表达式的潜在坑(可选优化)

你正则里写的是&lt;和&gt;,但实际抓取的htmlBody里大概率是真实的<和>符号(因为UrlFetchApp.fetch返回的是解码后的HTML)。如果网页源码里是<span>而不是&lt;span&gt;,你的正则就匹配不到数值。可以把正则改成:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:50:42