来自Google工作表的电子邮件,其中包含由嵌套标签中的单元格设置的(收件人,主题,正文)

时间:2016-08-25 17:39:30

标签: google-apps-script google-sheets google-docs

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

以下是我的脚本在代码的电子邮件部分中的样子:

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(Form!B3,“for”,Form!D3) 和     = CONCATENATE(表格!D5,“表示为”,Form!D3“:”,Form!B7“,”,Form!F4“

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

我是否需要澄清发送==='发送'?

任何帮助获得这项工作将不胜感激。

我认为Email notifications with body/subject containing cell value可能有一些我缺少的东西,但我还不足以让程序员知道我缺少什么?

编辑以显示完整代码:

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();  
}

1 个答案:

答案 0 :(得分:0)

我尝试了你的代码,我稍微修改了它,但实质上这是你自己的代码。

您的问题出在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),它运行良好。
  4. 你真的很接近它,就像我说尝试使用调试功能或Logger.log()来记录值,它真的很有用!

    祝你好运! :)