【问题标题】:Google Script to Send Email containing values from Sheet用于发送包含工作表值的电子邮件的 Google 脚本
【发布时间】:2018-12-05 03:27:39
【问题描述】:

我正在尝试让一个脚本工作,该脚本可以连接到谷歌表格,提取手机中的信息,并在标记后通过电子邮件发送。到目前为止,我有这个,来自互联网上的来源和一些定制。

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

上述工作、触发和发送正常。它唯一不会做的就是输入日期、姓名、号码和消息。

这些对于每封电子邮件都必须是唯一的,具体取决于刚刚标记为已发送的行。通常,一天只有几次,绝不会同时出现。

所以如果第 23 行标记为 SENT,则需要 A23、B23 和 C23。 如果第 66 行标记为 SENT,则需要 A66、B66 和 C66。

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

【问题讨论】:

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


【解决方案1】:

代码使用var range = sheet.getActiveCell() 获取活动单元格。然后你可以使用range.getRow() 来获取行号,然后你可以使用sheet.getRange(range.getRow(), columnNumber) 来获取所需的单元格,其中columnNumber 可以是5、9、10 和/或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];

等等。

【讨论】:

    【解决方案2】:

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

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

    所有用于记录信息的工作表都以“ph:”前缀开头。我得到了整个工作表数组,然后循环遍历它们以查找以“ph:”name.slice(0,3) 开头的工作表。找到后,我得到 A1:B6 的范围并将所有数据收集到一个数组中,然后使用以下算法 dObj [column1 中的值]=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 的数据验证为是或否。

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

    Documentation Reference:

    顺便说一下,这个版本的代码的工作方式。

    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来记录邮件信息。

    【讨论】:

      猜你喜欢
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多