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