使用UrlFetchApp时如何跳过空白、Value!等无效单元格避免脚本报错?
错误原因
你遇到的报错核心有两个:
- 空单元格、
#VALUE!错误的单元格内容不是字符串类型,直接调用match()方法会报方法不存在的错误 - 你在调用
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
相关产品推荐
相关产品推荐

