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

使用UrlFetchApp时如何跳过空白、Value!等无效单元格避免脚本报错?

错误原因

你遇到的报错核心有两个:

  1. 空单元格、#VALUE!错误的单元格内容不是字符串类型,直接调用match()方法会报方法不存在的错误
  2. 你在调用UrlFetchApp.fetch()之前没有做合法性校验,只要对应单元格内容不是合法可访问的图片链接,代码执行到fetch这一步就会直接终止,走不到后面的判断逻辑

修改后的完整代码

function emailImage(){
  const EMAIL_SENT = "EMAIL_SENT";
  // 可自行添加支持的图片后缀
  const IMAGE_EXT = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
  // 对应你原代码里存图片链接的列索引
  const IMAGE_COL_INDEX = [3,4,5];

  const sheet = SpreadsheetApp.getActiveSheet();
  const startRow = 2;
  const numRows = sheet.getLastRow() - startRow + 1; // 修正原代码取行数的错误,避免取到多余空行
  const dataRange = sheet.getRange(startRow, 1, numRows, 24);
  const data = dataRange.getValues();

  for (let i = 0; i < data.length; i++) {
    const row = data[i];
    const emailAddress = row[0];
    const subject = row[1];
    const message = row[2];
    const emailSent = row[23];

    // 已发送、无邮箱、邮箱格式错误的行直接跳过
    if (emailSent === EMAIL_SENT || !emailAddress || !emailAddress.includes('@')) continue;

    let attachments = [];
    let isValidRow = true;

    // 批量处理所有图片列
    for (let col of IMAGE_COL_INDEX) {
      const imageUrl = row[col];
      // 跳过空值、非字符串、非http开头的内容
      if (!imageUrl || typeof imageUrl !== 'string' || !imageUrl.startsWith('http')) {
        // 若要求三个图片都必须有才发,打开下面两行注释
        // isValidRow = false;
        // break;
        continue; // 默认缺图就跳过该附件,继续处理其他图片
      }
      // 校验是否为图片后缀
      const isImage = IMAGE_EXT.some(ext => imageUrl.toLowerCase().endsWith(ext));
      if (!isImage) continue;

      // 抓取图片加兜底,避免链接失效导致脚本终止
      try {
        const imageBlob = UrlFetchApp.fetch(imageUrl).getBlob();
        attachments.push(imageBlob);
      } catch (e) {
        console.log(`第${startRow + i}行第${col+1}列图片抓取失败:` + e.message);
        // 若要求所有图片抓取成功才发,打开下面两行注释
        // isValidRow = false;
        // break;
      }
    }

    // 校验通过才发邮件
    if (isValidRow) {
      try {
        MailApp.sendEmail(emailAddress, subject, message, {attachments: attachments});
        sheet.getRange(startRow + i, 24).setValue(EMAIL_SENT);
        SpreadsheetApp.flush();
      } catch (e) {
        console.log(`第${startRow + i}行邮件发送失败:` + e.message);
      }
    }
  }
}

修改说明

  • 修正了原代码取行数的逻辑错误,避免拉取多余空行
  • 所有可能报错的操作(图片抓取、邮件发送)都加了try-catch兜底,单个环节出错只会输出日志,不会终止整个脚本运行
  • 加了多层校验:空单元格、非链接、非图片格式的内容都会直接跳过,不会触发报错
  • 可根据业务需求调整规则:代码中已加注释说明如果要求三个图片都必须存在/抓取成功才发邮件的调整方式,默认规则是缺少个别图片时只发送存在的图片附件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 19:36:04