问题描述
下面的这段代码是从网络上逐部分抓取和复制粘贴的,它确实有效,在一些帮助下,我能够在一定程度上实现我在这个项目中的一个目标。问题是这样的:我有一个包含数据的谷歌表,我正在使用 UrlFetchApp 将图像附加到电子邮件,但是当我的脚本运行到空、空白或值时!细胞停止运行并中断。有什么办法可以防止这种情况吗?我是一个完全的新手,不知道。我在网上搜索过,确实找到了这些信息……How do I skip blank cells using MailApp.SendEmail? 我试图将其应用于我的情况,但无法做到。
if (emailAddress.match('@') === null){
continue; // skip this iteration of the loop and go to the next one
};
我尝试将其更改为我的项目情况...
if (image01.match('jpg') === null){
continue; // skip this iteration of the loop and go to the next one
};
但不幸的是,'image01.match' 不是一个函数(我知道你们所有的程序员现在都在笑) 所以我尝试了更多的东西,但也没有奏效....
if ((row[3]).match('jpg') === null){
continue; // skip this iteration of the loop and go to the next one
};
这里是完整的代码......非常感谢任何帮助或建议,谢谢!
function emailImage(){
var EMAIL_SENT = "EMAIL_SENT";
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = sheet.getLastRow();
// Fetch the range of cells
var datarange = sheet.getRange(startRow,1,numRows,24)
var data = datarange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var emailAddress = row[0]; // First column
var subject = row[1]; // Second column
var message = row[2]; // Third column
var image01 = UrlFetchApp.fetch(row[3]).getBlob();
var image02 = UrlFetchApp.fetch(row[4]).getBlob();
var image03 = UrlFetchApp.fetch(row[5]).getBlob();
var emailSent = row[23]; //
if (emailSent != EMAIL_SENT) { // Prevents sending duplicates
MailApp.sendEmail(emailAddress,subject,message,{attachments: [image01,image02,image03]});
sheet.getRange(startRow + i,24).setValue(EMAIL_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
解决方法
试试这个:
function emailImage() {
const sh = SpreadsheetApp.getActiveSheet();
const sr = 2;
const rg = sh.getRange(sr,1,sh.getLastRow() - sr + 1,24);//your previous code was not calculating the number of rows properly so you were trying run the code in rows that probably did not have any data.
const data = rg.getValues();
for (let i = 0; i < data.length; ++i) {
let row = data[i];
let emailAddress = row[0]; // First column
let subject = row[1]; // Second column
let message = row[2]; // Third column
let image01 = UrlFetchApp.fetch(row[3]).getBlob();
let image02 = UrlFetchApp.fetch(row[4]).getBlob();
let image03 = UrlFetchApp.fetch(row[5]).getBlob();
let emailSent = row[23];
if (emailAddress && subject && message && image01 && image02 && image03 && emailSent != "EMAIL_SENT") { // Prevents sending duplicates and emails without all of the data being present
MailApp.sendEmail(emailAddress,subject,message,{ attachments: [image01,image02,image03] });
sh.getRange(sr + i,24).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
试试这个:
function emailImage() {
const sh = SpreadsheetApp.getActiveSheet();
const sr = 2;
const rg = sh.getRange(sr,24)
const data = rg.getValues();
for (let i = 0; i < data.length; ++i) {
let row = data[i];
let emailAddress = row[0]; // First column
let subject = row[1]; // Second column
let message = row[2]; // Third column
let options ={attachments:[]};
let image01 = UrlFetchApp.fetch(row[3]).getBlob();
if(image01)options.attachments.push(image01);
let image02 = UrlFetchApp.fetch(row[4]).getBlob();
if(image02)options.attachments.push(image02);
let image03 = UrlFetchApp.fetch(row[5]).getBlob();
if(image03)options.attachments.push(image03);
let emailSent = row[23];
if (emailAddress && subject && message && emailSent != "EMAIL_SENT") { // Prevents sending duplicates
MailApp.sendEmail(emailAddress,options);
sh.getRange(sr + i,24).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
你也可以这样试试:
function emailImage() {
const sh = SpreadsheetApp.getActiveSheet();
const sr = 2;
const rg = sh.getRange(sr,24)
const data = rg.getValues();
for (let i = 0; i < data.length; ++i) {
let row = data[i];
let emailAddress = row[0]; // First column
let subject = row[1]; // Second column
let message = row[2]; // Third column
let options ={attachments:[]};
let urls=[row[3],row[4],row[5]].filter(e => e != '');
前一行删除空白的 url,下一行只推送返回非空的图像 blob。因此,您可以使用尽可能多的图像来保存列,或者您可以将所有 url 放入一个单元格中,并使用 say control enter 将它们分开,在它们之间放置 '\n' 然后您可以使用。 类似 row[3].toString().split('\n').filter(e=>e)...etc
urls.forEach(u=>{let img = UrlFetchApp.fetch(u).getBlob();if(img)options.attachments.push(img);});
let emailSent = row[23];
if (emailAddress && subject && message && emailSent != "EMAIL_SENT") { // Prevents sending duplicates
MailApp.sendEmail(emailAddress,24).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
一般来说,我最好的代码在经过几次迭代后才会向我展示。
,blob
是一种对象类型,您不能直接 .match()
它。
相反,像这样使用 try-catch
:
try{
var image01 = UrlFetchApp.fetch(row[3].toString()).getBlob();
console.log(image01.getContentType()); //should be image/png.
console.log(image01); //should be {}
}
catch(Exception)
{
console.log("Link error!");
}
如果链接中有任何错误,catch
会处理它。否则,您可以在 try
部分发送邮件。
希望对你有帮助。如果这不是你想要的,那么我很抱歉。
,这似乎有效.. 多项努力的结合。感谢元人!!我要先测试一下....
function emailImage() {
var EMAIL_SENT = "EMAIL_SENT";
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;
var numRows = sheet.getLastRow();
// Fetch the range of cells
var dataRange = sheet.getRange(startRow,numRows,24)
var data = dataRange.getValues();
for (let i = 0; i < data.length; ++i) {
let row = data[i];
let emailAddress = row[0]; // First column
let subject = row[1]; // Second column
let message = row[2]; // Third column
let options ={attachments:[]};
let urls=[row[3],row[5]].filter(e => e != '');
urls.forEach(u=>{let img = UrlFetchApp.fetch(u).getBlob();if(img)options.attachments.push(img);});
let emailSent = row[23];
if (emailAddress && subject && message && emailSent != "EMAIL_SENT") { // Prevents sending duplicates
MailApp.sendEmail(emailAddress,24).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}