微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法跳过空,空白或值!使用 urlfetchapp 和或在我的数据范围中时的单元格?或者我的问题的其他解决方案?

如何解决有没有办法跳过空,空白或值!使用 urlfetchapp 和或在我的数据范围中时的单元格?或者我的问题的其他解决方案?

下面的这段代码是从网络上逐部分抓取和复制粘贴的,它确实有效,在一些帮助下,我能够在一定程度上实现我在这个项目中的一个目标。问题是这样的:我有一个包含数据的谷歌表,我正在使用 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();
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。