Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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
Google apps script 谷歌应用程序脚本:仅针对新条目的电子邮件触发器(不使用谷歌表单)_Google Apps Script_Google Sheets_Google Docs_Google Apps - Fatal编程技术网

Google apps script 谷歌应用程序脚本:仅针对新条目的电子邮件触发器(不使用谷歌表单)

Google apps script 谷歌应用程序脚本:仅针对新条目的电子邮件触发器(不使用谷歌表单),google-apps-script,google-sheets,google-docs,google-apps,Google Apps Script,Google Sheets,Google Docs,Google Apps,我是一个初学者,在编码,我尝试了很多事情(解决方案),但没有脚本正在运行。 我正在使用现有的sendEmail脚本(见下文)向新的电子表格条目发送电子邮件 我没有使用谷歌表单。我正在从另一个电子表格中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件 我遇到的问题是,脚本会向电子表格的每一行发送电子邮件,即使这些信息已经发送 我尝试了一些变通方法,虽然这些方法在论坛中被命名,但对我的情况毫无帮助。我不想只向最后一个条目发送电子邮件。我想向不同数量的新条目发送电子邮件,如果可能的

我是一个初学者,在编码,我尝试了很多事情(解决方案),但没有脚本正在运行。 我正在使用现有的sendEmail脚本(见下文)向新的电子表格条目发送电子邮件

我没有使用谷歌表单。我正在从另一个电子表格中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件

我遇到的问题是,脚本会向电子表格的每一行发送电子邮件,即使这些信息已经发送

我尝试了一些变通方法,虽然这些方法在论坛中被命名,但对我的情况毫无帮助。我不想只向最后一个条目发送电子邮件。我想向不同数量的新条目发送电子邮件,如果可能的话,这应该由onEdit事件触发。 我希望,有人能尽快帮我

  var EMAIL_SENT = "EMAIL_SENT";

  function sendEmails(onlyLast) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheets()[0];
  var startRow = 2;
  var lastRow = datasheet.getlastRow()-1;
  if (onlyLast)
  startRow = endRow;
  var dataRange = dataSheet.getRange(startRow, 1, lastRow, 4);

  var templateSheet = ss.getSheets()[1];
  var emailTemplate = templateSheet.getRange("A1").getValue();

  // Create one JavaScript object per row of data.
  var objects = getRowsData(dataSheet, dataRange);

  // For every row object, create a personalized email from a template and send
  // it to the appropriate person.
  for (var i = 0; i < objects.length; ++i) {
    // Get a row object
    var rowData = objects[i];


    var file = DriveApp.getFileById('');
    // Generate a personalized email.
    // Given a template string, replace markers (for instance ${"First Name"}) with
    // the corresponding value in a row object (for instance rowData.firstName).
    var emailText = fillInTemplateFromObject(emailTemplate, rowData);
    var emailSubject = "Tutorial: Simple Mail Merge";
    var emailSent;   
    if (emailSent != EMAIL_SENT) {  
      var subject = "Tutorial: Simple Mail Merge";
      MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText, {attachments:[file.getAs(MimeType.PDF)]});
      dataSheet.getRange(startRow + i, 5).setValue(EMAIL_SENT);
      SpreadsheetApp.flush();
    }
  }
}
var EMAIL\u SENT=“EMAIL\u SENT”;
发送电子邮件功能(仅限LAST){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var dataSheet=ss.getSheets()[0];
var startRow=2;
var lastRow=datasheet.getlastRow()-1;
if(onlyLast)
startRow=endRow;
var dataRange=dataSheet.getRange(startRow,1,lastRow,4);
var templateSheet=ss.getSheets()[1];
var emailTemplate=templateSheet.getRange(“A1”).getValue();
//每行数据创建一个JavaScript对象。
var objects=getRowsData(数据表,数据范围);
//对于每个行对象,从模板创建个性化电子邮件并发送
//把它交给合适的人。
对于(变量i=0;i
首先,我建议不要使用onEdit,而是使用时间驱动的触发器来检查更改。这样你的脚本就不会一直试图发送电子邮件,即使你错过了键入的内容

其次,您需要某种方法来指示数据是否已被处理。您可以让脚本加粗所有已处理的信息,然后通过电子邮件发送任何不加粗的内容

这里有一个链接,指向我为某人编写的一个类似脚本,如果脚本中出现“取消”一词,该脚本将通过电子邮件发送一份人员列表


-bj

以下是一个电子表格示例:

将其置于定时触发器上:

function sendNew(){
  var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
  var templetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("template");
  var templateSubject = templetSheet.getRange(1, 2).getValue();
  var templateBody = templetSheet.getRange(2, 2).getValue();

  for (var i =2; i<= dataSheet.getLastRow(); i++){
    var name = dataSheet.getRange(i, 1).getValue();
    var color = dataSheet.getRange(i, 2).getValue();
    var status = dataSheet.getRange(i, 3).getValue();

    var subject = templateSubject.replace("<<Name>>", name);
    var body = templateBody.replace("<<Name>>", name);
    body = body.replace("<<Color>>", color);

    if (status == ""){
      MailApp.sendEmail('youremail@gmail.com', subject, body);
      dataSheet.getRange(i,3).setValue("Email Sent");
    } 
  }
}
函数sendNew(){
var dataSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“数据”);
var templetSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“模板”);
var templateSubject=templatsheet.getRange(1,2).getValue();
var templateBody=templetSheet.getRange(2,2).getValue();

对于(var i=2;i您在代码中定义了
var emailSent;
,但不给它赋值

所以下面的比较总是返回true。
if(emailSent!=EMAIL_SENT){

尝试用以下内容替换
var emailSent;

var emailSent = dataSheet.getRange(startRow + i, 5).getValue();
它应该像预期的那样工作

最后,如另一个答案中所述,在计时器触发器上而不是OneEdit上运行此函数,以避免部分电子邮件发送(如果用户更改了单元格内容或键入错误…)

编辑:最后一点注意,请删除第一行
var EMAIL\u SENT=“EMAIL\u SENT”
,我知道它来自谷歌的一个示例,但它在这里没有用,而且(IMHO)非常混乱,因为最后你不知道EMAIL\u SENT是一个变量还是一个值…,请将你的条件更改为

if (emailSent != 'EMAIL_SENT') { // which compares a value to a string, clearly ;-)

这对我来说太棒了,这是对Bjorn的修改。Bjorn剧本的道具谢谢,希望这条线能像今晚对我一样帮助别人。谢谢大家

    function ssForward() {

    // DEFINE YOUR MAIN SPREADSHEET
    var ss = SpreadsheetApp.openById("SPREADSHEET_ID_ITS_IN_THE_SS_URL");

    // DEFINE THE DATA SHEET THAT RECIEVES THE SUBMISSIONS HERE
    var dataSheet = ss.getSheetByName("data");

    // DEFINE THE TEMPLATE SHEET THAT HAS THE EMAIL TEMPLATE INSIDE OF IT
    var templetSheet = ss.getSheetByName("template");

    //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
    var templateSubject = templetSheet.getRange(1, 2).getValue();

    //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
    var templateBody = templetSheet.getRange(2, 2).getValue();

    //NOW RUN A FOR LOOP THAT GOES THROUGH EACH ENTRY IN EACH ROW (var i = the row in your spreadsheet )      
    for (var i = 2; i <= dataSheet.getLastRow(); i++) {

        // ADD CURRENTLY VIEWED ENTRY TO VAR (var phone = the sheet in row i, column 3)
        // all 3 of these var work the same way    
        var phone = dataSheet.getRange(i, 3).getValue();
        var location = dataSheet.getRange(i, 4).getValue();
        var status = dataSheet.getRange(i, 10).getValue();

        // NOW USE THE templetSheet VAR DEFINED ABOVE AND REPLACE THE PLACEHOLDER TEXT WITH THE APPROPRIATE VARIABLE

        //REPLACE THE SUBJECT TEMPLATE TEXT <<phone>> WITH THE CONTENTS OF THE VAR 'phone' defined above.
        var subject = templateSubject.replace("<<phone>>", phone);

        //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<location>> - WITH THE CONTENTS OF THE VAR 'location' defined above.
        var body = templateBody.replace("<<location>>", location);

        //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<phone>> - WITH THE CONTENTS OF THE VAR 'phone' defined above.
        body = body.replace("<<phone>>", phone);

        // IF OUR STATUS CELL IS EMPTY
        if (status == "") {

            // SEND THE EMAIL FROM 'DESIRED@EMAIL.com', USE THE 'subject' VAR FOR THE SUBECT, AND THE VAR 'templateBody' FOR THE MESSAGES BODY
            MailApp.sendEmail('YOUR@EMAIL.com', subject, body);

            // MARK THE ROW AS COMPLETED
            dataSheet.getRange(i, 10).setValue("Email Notification Sent");
        }
    }
}
函数ssForward(){
//定义主电子表格
var ss=SpreadsheetApp.openById(“电子表格ID”位于URL中);
//在此处定义接收提交的数据表
var数据表=ss.getSheetByName(“数据”);
//定义包含电子邮件模板的模板工作表
var templetSheet=ss.getSheetByName(“模板”);
//定义包含主题模板文本的单元格
var templateSubject=templatsheet.getRange(1,2).getValue();
//定义包含主题模板文本的单元格
var templateBody=templetSheet.getRange(2,2).getValue();
//现在运行一个FOR循环,遍历每行中的每个条目(var i=电子表格中的行)

对于(var i=2;我从不共享具有编辑权限的工作表,即使在这个论坛上,人们有时也会有坏习惯,并用奇怪的内容填充工作表;-)我只把它设置为视图,如果他们需要进一步测试,任何人都可以复制。嗨,你是对的。抱歉我迟了的回复和第二篇文章,我现在已经删除了。谢谢比约恩。我对代码做了一些修改,以满足我的需要。这真是太棒了!谢谢大家。没问题,如果你满意的话,你应该考虑接受他的答案。…这就是stackoverflow的工作方式:-)。欢迎光临,祝你好运。