为什么我的Google脚本代码从错误的行开始?

时间:2019-03-18 01:52:22

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

因此,我一直在从事一个项目,该项目涉及一个自动发送电子邮件的代码。该代码应该在每个余额之外的最右边一栏中写上“已发送电子邮件”。

因此,这是我的自动电子邮件功能和指向电子表格的链接: https://docs.google.com/spreadsheets/d/14ukVvpMh0dJr5_HLUYxK1n4m6HXd2tvAj-bMrixAQFg/edit?usp=sharing

    function sendEmails() { 
  var EMAIL_SENT = "EMAIL SENT"
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Control_Mens")  
  var dataRange = sheet.getRange(2, 2, 61, 16) 
  var data = dataRange.getValues();
  for (i in data) { 
    var row = data[i]; 
    var emailAddress = row[0];
    var message = row[1]; 
    var emailSent = row[15]
    if (emailSent != EMAIL_SENT){
      var subject = "Subject"; 
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(2 + i, 17).setValue(EMAIL_SENT);
    }
  } 
}

虽然我认为我可能在计算错误(例如,再增加一行,反之亦然),但我已经多次运行它,它会将电子邮件发送给工作表中的每个人,但它只会在旁边写“ EMAIL SENT”具体的人。

2 个答案:

答案 0 :(得分:3)

问题

我想您在标题中说的问题是i是字符串。参见下面的脚本。

var data = ["data1", "data2", "data3"];
for (i in data){
Logger.log(typeof i);
}

所有i都是字符串。如果i(1、2、3)是字符串,则sheet.getRange(2 + i, 17)

  • sheet.getRange("21", 17).getA1Notation();这是Q21。
  • sheet.getRange("22", 17).getA1Notation();这是Q22。
  • sheet.getRange("23", 17).getA1Notation();,这是问题23。

这是问题的原因。此问题不会在已发送电子邮件的行中写入“ EMAIL SENT”。

解决方案

使用数字类型的i

  1. i = Number(i);放在for (i in data) {下方。
  2. for (i in data)替换为for (var i=0; i<data.length; i++)。这就是库珀的答案。

答案 1 :(得分:0)

我像这样测试了您的代码,它运行良好:

我有一些调整。

function sendEmails() { 
  var EMAIL_SENT="EMAIL SENT";
  var sh=SpreadsheetApp.getActive().getSheetByName("Sheet95");  
  var rg=sh.getRange(2, 2, 61, 16); 
  var data=rg.getValues();
  var s='';
  for (var i=0;i<data.length;i++) { 
    var row=data[i]; 
    var emailAddress=row[0];
    var message=row[1]; 
    var emailSent=row[15];
    if (emailSent!=EMAIL_SENT){
      var subject=row[2];//added this just to test the data position 
      //MailApp.sendEmail(emailAddress, subject, message);
       s+=Utilities.formatString('<br />EmailAddress:%s<br />Subject: %s<br />Message:%s<br /><hr width="100%">',emailAddress,subject,message);
      sh.getRange(2 + i, 17).setValue(EMAIL_SENT);
    }
  } 
  var userInterface=HtmlService.createHtmlOutput(s);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Emails')
}

我想知道您是否在项目的其他地方使用了变量i,并且由于您实际上没有声明i,因此可能是从项目的其他地方选择了全局值。只是猜测。