来自 google 个工作表的电子邮件(收件人、主题、正文)由嵌套选项卡中的单元格设置

email from google sheets with (recipient, subject, body) set by cells in a nested tab

我正在尝试让 sheet 在按下保存按钮时发送电子邮件。只有在验证了正确的标准时,它才应该发送它。保存按钮还将表单内容复制到记录页面,然后清除表单,但电子邮件功能应该先发生。目前一切正常,但电子邮件

对于代码的电子邮件部分,我的脚本如下所示:

function emailReferals(){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('namedSheet');
  var dataRange = sheet.getRange('X44:Z53'); 
  // Fetch values for each row in the Range.
  var data = dataRange.getValues().toString();
  for (i in data) {
    var send = [0][0];
    var recipients = [0][1];
    var subject = [0][2];
    var message = [0][3];
    if(send === 'Send'){
      MailApp.sendEmail(recipients,subject,message);
    }
  } 
}

请注意,这不是许多电子邮件教程中看到的 startRow numRow,例如 https://developers.google.com/apps-script/articles/sending_emails 我的数据在页面深处,因此我在示例中调用了一个范围,例如 x44:Z53。

我从中提取的细胞是这样说的: =CONCATENATE(表格!B3,“对于“,表格!D3) 和 =CONCATENATE(Form!D5, " was repremended for ",Form!D3,": ",Form!B7," by ",Form!F4)

我需要使用行[#]还是我可以使用[#][#]?

我还需要澄清一下 send ==='Send"?

如能帮助完成这项工作,我们将不胜感激。

我认为 可能有一些我遗漏的东西,但我不是一个足够的程序员来弄清楚我遗漏了什么?

编辑以显示完整代码:

function onOpen() {
SpreadsheetApp.getUi().createMenu('My Menu').addItem('Copy Cells', 'copyCells').addToUi();
}


//send emails for Discipline Referrals to proper authorities.
function emailDNRReferals(){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('HouseSort');
  var dataRange = sheet.getRange('X44:Z53');
  // Fetch values for each row in the Range.
  var data = dataRange.getValues().toString();
  for (i in data) {
    //var row = data[i];
    var send = [0][0];
    var recipients = "rslawy@nmmediaarts.org, rpdsalway@gmail.com";
    var subject = [0][2];
    var message = [0][3];
    if(send == 'Send'){
      MailApp.sendEmail(recipients,subject,message);
    }
  } 
}


//Save and clear the form
function SaveDNRRecords() {
  var ss = SpreadsheetApp.getActive();
  var source = ss.getSheetByName('Form');
  var records = ss.getSheetByName(source.getRange('A1').getValues()); //get the tab to send the save data to.
  var val = source.getRange('B3:G11').getValues(); //get the cells with information to copy
  // get values from zero indext cells and save to records. 
  // 2,2=StudentD5.2,0=BehaviorD3.1,4=UserF-G4.0,0=CatagoryB3.0,2=BehaviorD3.4,0=NoteB-D7.8,5=TotalG11. Nulls leave space for houses on line 14. 
  var write = [val[2][2], val[2][0], val[1][4], new Date(), val[0][0], val[0][2], val[4][0], val[8][5],null, null, null, null, null, null,null];           
               write[Number(val[3][3].match(/(\d+)/)[0]) + 7] = val[8][5]; 
  records.appendRow(write);  

  var referrals = ss.getSheetByName('DisciplineReferrals'); //Save some data to the DisciplineReferrals tab.
  var val2 =source.getRange('D1:J1').getValues(); // gather content that shows only if B3=Disipline Referral
  var write = [val2[0][1], val2[0][2], val2[0][3], val2[0][0], val2[0][4], val2[0][5], val2[0][6]]; //Zero indext row from D1 to J1
  referrals.appendRow(write); //Write the data to the first available row on the selected (line 8) term tab.

  //Clear the cells for the next use.
  source.getRange('B3').clearContent();
  source.getRange('D3').clearContent();
  source.getRange('F4').clearContent();
  source.getRange('B5').clearContent();
  source.getRange('D5').clearContent();
  source.getRange('B7').clearContent();
  source.getRange('G10').clearContent();
  source.getRange('B7:D7').mergeAcross(); // this merges the cell to self heal potential user error.
  source.getRange('B11').clearContent();

}

//Clear the form without saving.
function clearDNRForm() { 
  var ss = SpreadsheetApp.getActive();
  var source = ss.getSheetByName('Form');
  source.getRange('B3').clearContent();
  source.getRange('D3').clearContent();
  source.getRange('F4').clearContent();
  source.getRange('B5').clearContent();
  source.getRange('D5').clearContent();
  source.getRange('B7').clearContent();
  source.getRange('G10').clearContent();
  source.getRange('B7:D7').mergeAcross();
  source.getRange('B11').clearContent();  
}

我试过你的代码,我稍微修改了一下,但本质上这都是你自己的代码。

您的问题出在 if 语句上。下面的 if 语句有“==”而不是“===”它无法确定类型。可能有一种更清洁的方法,但它有效。 它向我发送了电子邮件,只是一个小修复:)(两只眼睛等等!)

function emailReferals(){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('sheet1');
  var dataRange = sheet.getRange('W44:Z47'); 
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var send = row[0];
    var recipients = row[1];
    var subject = row[2];
    var message = row[3];
    Logger.log(data);
    if(send == 'Send'){
      MailApp.sendEmail(recipients,subject,message);

    }
  } 
}

我建议看看这个:Tutorial: Sending emails from a Spreadsheet。它直接来自 Google Apps 团队,是一个很好的简单解决方案!

祝你好运,希望一切顺利,还有什么问题尽管问!

编辑: 我用新的眼光重新审视了您的脚本,并使用与您相同的方法再次对其进行了测试,有几处需要修改,它们是:

  1. sheet.getRange('X44:Z53'); 这只选择了 3 列,你需要 4 这可能缺少发送列,只需检查是否它确实包括所有列,否则它可能不会发送或会出错
  2. var send = [0][0]; 你确实需要使用我用过的类似方法,即 var row = data[i] ;var send = row[0]; 因为如果你不这样做,你实际上并没有查询数组,我检查了一下,它只是显示空白数据(这可能是为什么它不是的主要原因发送)。重要的一点不是 var row,而是 data[i]
  3. 我也在 =CONCATENATE(X44,W44) 上试过了,效果很好。

你真的很熟悉它,就像我说的尝试使用调试功能或 Logger.log() 来记录值,它真的很有用!

祝你好运! :)