繁体   English   中英

Google脚本发送包含工作表中值的电子邮件

[英]Google Script to Send Email containing values from Sheet

我正在尝试获取一个脚本,该脚本可以挂接到Google工作表中,提取手机中获取的信息,并在标记后通过电子邮件发送。 到目前为止,我已经从互联网上获得了一些定制信息。

function sendApprovalEmail() {

var sheetNameToWatch = "SHEETNAMEGOESHEREUSUALLY";
var columnNumberToWatch = 12; // column A = 1, B = 2, etc.
var valueToWatch = "SENT";

var date = 5;
var name = 9;
var number = 10;
var message = 11;

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();

if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
var emailAddress = "MYEMAILGOESHEREUSUALLY";
var subject = "Missed Call Notifcation";
var email = "Hello! "+date+" "+name+" "+number+" "+message+"";
MailApp.sendEmail(emailAddress, subject, email);
}
}

以上内容可以正常工作,触发和发送。 它唯一不做的就是吸取日期,名称,编号和消息。

根据刚刚标记为SENT的行,每封电子邮件都必须具有唯一性。 通常,只有一天,而不是同一天。

因此,如果将第23行标记为SENT,则需要A23,B23和C23。 如果第66行标记为SENT,则需要A66,B66和C66。

如何获取脚本以在脚本中检测到“已发送”的行的第5、9、10和11列中查找值?

该代码使用var range = sheet.getActiveCell()获取活动单元格。 然后可以使用range.getRow()获取行号,然后可以使用诸如sheet.getRange(range.getRow(), columnNumber)来获取所需的单元格,其中columnNumber可以是columnNumber和/或11.换句话说,代替

var date = 5;

采用

var date = sheet.getRange(range.getRow(), 5).getValue();

但是把上面的线放在

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();

对名称,数字和消息变量执行相同的操作。

注意:还有其他更有效的方法,例如使用sheet.getDataRange().getValues() ,它将返回具有所有图纸值的数组数组,

var date = data[range.getRow()][5];

等等。

这可能与您要寻找的接近:

首先,您必须确定电子表格的格式,以便所有操作员都能以标准格式记录信息。 我为每个工作表使用以下格式。

在此处输入图片说明

用于记录信息的所有工作表均以“ ph:”前缀开头。 我得到了整个工作表数组,然后遍历它们以查找以'ph:' name.slice(0,3)开头的工作表。 找到后,我得到A1:B6的范围并将所有数据收集到一个数组中,然后使用以下算法dObj [value in column1] = value in column2,遍历该数组,将所有信息放入关联数组。 因此,在我的示例中,您可以使用dObj.Name来获取名称,并通过使用dObj.Message等来获取消息。 因此,这会将第一列中的键与第二列中的值相关联。

现在这里是代码:

function sendApprovalEmails(){
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++){
    var sh=shts[i];
    var name=sh.getName();
    if(name.slice(0,3)=='ph:'){//finds the operator log sheets
      var dObj={};
      var rg=sh.getRange('A1:B6');//Use a fixed range so you can use the rest of the sheet for whatever
      var vA=rg.getValues();
      for(var j=0;j<vA.length;j++){
        dObj[vA[j][0]]=vA[j][1];//Builds the associative array
      }
      if(dObj.Approval=='Yes'){
        Logger.log('Send Email:\nDate: %s\nNumber: %s\nName: %s\nMessage: %s,To: %s',Utilities.formatDate(new Date(dObj.Date),Session.getScriptTimeZone(),"E MMM dd, yyyy"),dObj.Number,dObj.Name,dObj.Message,dObj.Email);
        var recipient=dObj.email;
        var subject="Missed Call Notification";
        var body = Utilities.formatString('Hello! %s %s %s %s',Utilities.formatDate(new Date(dObj.Date),Session.getScriptTimeZone(),"E MMM dd, yyyy"),dObj.Name,dObj.Number,dObj.Message);
        //MailApp.sendEmail(recipient, subject, body);
      }
    }
  }
}

在我的示例中,B1的数据验证为“是”或“否”。

当然,这可能仅仅是一个起点。 您可以创建代码以复制母版纸,并在每次通话时打开它。 我不知道工作表数量是否有限制,但一张电子表格中的单元格数量是否有限制。

文档参考:

顺便说一下,此版本的代码可以正常工作。

function sendApprovalEmail() {

var sheetNameToWatch = "test";
var columnNumberToWatch = 1; 
var valueToWatch = "SENT";
var date = 5;
var name = 9;
var number = 10;
var message = 11;

var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveCell();

if (sheet.getName()==sheetNameToWatch && range.getColumn()==columnNumberToWatch && range.getValue() == valueToWatch) {
var emailAddress = "foundit@found.com";
var subject = "Missed Call Notifcation";
var email = Utilities.formatString('Hello! %s %s %s %s',date,name,number,message);
//MailApp.sendEmail(emailAddress, subject, email);
  Logger.log('\nemailAddress: %s\nsubject: %s\nemail: %s',emailAddress,subject,email);
}
}

我不喜欢在调试时发送大量无用的电子邮件,因此我仅使用Logger记录电子邮件信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM