Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在google sheets中发送电子邮件后出现onEdit问题_Function_Google Apps Script_Google Sheets - Fatal编程技术网

Function 在google sheets中发送电子邮件后出现onEdit问题

Function 在google sheets中发送电子邮件后出现onEdit问题,function,google-apps-script,google-sheets,Function,Google Apps Script,Google Sheets,以下是我在谷歌脚本中的代码: function Send(){ Browser.msgBox("Send"); } function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; var lr = sheet.getLastRow(); var dataRange = sheet.getRange(startRow, 1, lr-1, 6);

以下是我在谷歌脚本中的代码:

function Send(){
Browser.msgBox("Send");
   }

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  var lr = sheet.getLastRow();

  var dataRange = sheet.getRange(startRow, 1, lr-1, 6);

  var data = dataRange.getValues();

  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var name = row[0];
    var emailAddress = row[1];
    var date = row[2];
    var city = row[3];
     var status = row[6];
    
    if (emailAddress.match('@')  === null){
   continue;
    };

    var subject = row[4];
    var message = "Hey " + name + ", welcome in the team " + row[5];

    MailApp.sendEmail(emailAddress, subject, message);

    sheet.getRange(i+2,7).setValue("Sent");
      }
}
**如果我在第7列中手动写入“已发送”,则该行将移动到另一页。但是当我运行第一个函数,并且“Sent”出现在该列中时,onEdit函数不起作用。 因此,基本上这两个功能都可以工作,但不能同时工作

有人知道此问题的解决方法吗?***

问题:
  • 您试图通过脚本触发
    onEdit
    函数,但触发器不是这样工作的。缔约国声明如下:
当用户更改值时,
onEdit(e)
触发器将自动运行 电子表格中任何单元格的

也就是说,
onEdit
触发器仅通过用户操作激活,而不是通过脚本或公式激活

  • 您不需要单独的函数来检查值是否已发送,然后用另一个函数删除该行。发送电子邮件后,您可以在同一功能内移动数据和删除行

  • 最后但并非最不重要的一点是,当以迭代方式删除行时,我们会更改工作表的结构,因此数据输入与更新的结构不匹配。为了缓解这个问题,我们可以将要删除的行的索引存储在一个数组中,然后使用该数组向后删除这些行

解决方案: 假设您的代码单独工作,这也应该工作:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Welcome");
  var targetSheet = ss.getSheetByName("Done");
  var startRow = 2;
  var lr = sheet.getLastRow();
  var dataRange = sheet.getRange(startRow, 1, lr-1, 6);
  var data = dataRange.getValues(); 
  var colNumber = sheet.getLastColumn()-1;
  var delRows = [];
  for (var i = 0; i < data.length; i++) {
      var row = data[i];
      var name = row[0];
      var emailAddress = row[1];
      var date = row[2];
      var city = row[3];
      var status = row[6];
      if (emailAddress.match('@')  === null){
         continue;
      };
      var subject = row[4];
      var message = "Hey " + name + ", welcome in the team " + row[5];
      MailApp.sendEmail(emailAddress, subject, message);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      var sourceRange = sheet.getRange(i+startRow, 1, 1, colNumber);
      sourceRange.copyTo(targetRange);
      delRows.push(i+startRow); 
      }   
  // delete rows in reverse order    
  delRows.reverse().forEach(ri=>{sheet.deleteRow(ri)});  
}
函数myFunction(){
var ss=SpreadsheetApp.getActive();
var sheet=ss.getSheetByName(“欢迎”);
var targetSheet=ss.getSheetByName(“完成”);
var startRow=2;
var lr=sheet.getLastRow();
var dataRange=sheet.getRange(startRow,1,lr-1,6);
var data=dataRange.getValues();
var colNumber=sheet.getLastColumn()-1;
var delRows=[];
对于(变量i=0;i{sheet.deleteRow(ri)});
}

您不再需要
onEdit
函数,这样您就可以删除它了。

当我运行脚本时,会弹出一条错误消息:TypeError:Cannot read null myFunction@code.gs:6的属性“getLastRow”。此外,我想删除已发送电子邮件的行,但也将其存储在另一个名为“Done”的选项卡上@Fabien确保您有一张名为
Welcome
的工作表和一张名为
Done
的工作表。这将解决你的两个问题。确保图纸名称与这两个单词完全匹配。没有额外的空格或不同的大写/小写字母。选项卡名称中确实存在错误。再次感谢您的帮助:)
function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Welcome");
  var targetSheet = ss.getSheetByName("Done");
  var startRow = 2;
  var lr = sheet.getLastRow();
  var dataRange = sheet.getRange(startRow, 1, lr-1, 6);
  var data = dataRange.getValues(); 
  var colNumber = sheet.getLastColumn()-1;
  var delRows = [];
  for (var i = 0; i < data.length; i++) {
      var row = data[i];
      var name = row[0];
      var emailAddress = row[1];
      var date = row[2];
      var city = row[3];
      var status = row[6];
      if (emailAddress.match('@')  === null){
         continue;
      };
      var subject = row[4];
      var message = "Hey " + name + ", welcome in the team " + row[5];
      MailApp.sendEmail(emailAddress, subject, message);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      var sourceRange = sheet.getRange(i+startRow, 1, 1, colNumber);
      sourceRange.copyTo(targetRange);
      delRows.push(i+startRow); 
      }   
  // delete rows in reverse order    
  delRows.reverse().forEach(ri=>{sheet.deleteRow(ri)});  
}