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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/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
Javascript 按字符串分组数组_Javascript_Google Apps Script - Fatal编程技术网

Javascript 按字符串分组数组

Javascript 按字符串分组数组,javascript,google-apps-script,Javascript,Google Apps Script,我需要一个人帮我整理一下。 我有一个脚本(见下文),它拖网浏览谷歌的工作表,检查一个项目是否接近到期日,或者是否违反了到期日。那部分正在发挥作用。我需要它做的是在资源接近或破坏时向分配的资源发送电子邮件。这很简单,mailApp很好用。但我想做的是将信息分组,以避免向人们的邮箱发送垃圾邮件 代码: function mailBot() { var warningDays = 14; var data = cwSheet.getDataRange().getValues(); data

我需要一个人帮我整理一下。 我有一个脚本(见下文),它拖网浏览谷歌的工作表,检查一个项目是否接近到期日,或者是否违反了到期日。那部分正在发挥作用。我需要它做的是在资源接近或破坏时向分配的资源发送电子邮件。这很简单,mailApp很好用。但我想做的是将信息分组,以避免向人们的邮箱发送垃圾邮件

代码:

function mailBot() {
  var warningDays = 14;
  var data = cwSheet.getDataRange().getValues();
  data.slice(1).forEach(function(row) {
    var user = row[0];
    var userEmail = buildMailAddress(user);
    var projectName = row[3];
    var date = row[8];
    var today = new Date();
    if (
      row[0] !== "" &&
      row[0] !== "Unassigned" &&
      row[0] !== "Proof of Concept"
    ) {
      var dueDate = new Date(date);
      if (dateDiff(dueDate, today) >= 1) {
//        Logger.log("**BREACHED** | %s", row);
//       TODO: Group results to send a single mail rather than multiple mails.
      } else if (dateDiff(today, dueDate) <= warningDays) {
//        Logger.log("**DUE** | %s", row);
//       TODO: Group results to send a single mail rather than multiple mails.
      }
    }
  });
}
[19-01-22 02:24:40:852 PST] **BREACHED** | [Darth Vader, Link, , Some project, , Project, Group, Shaping, Tue Jan 01 00:00:00 GMT+00:00 2019, Green, , , ]
[19-01-22 02:24:40:853 PST] **BREACHED** | [Darth Vader, Link, www.google.com, Some project, , Project, Department, Shaping, Fri Oct 26 00:00:00 GMT+01:00 2018, Green, , , ]
[19-01-22 02:24:40:855 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 1, , Project, JL, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:856 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 2, , Small Dev, Waitrose, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:857 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 3, , Project, Group, Development, Tue Jan 01 00:00:00 GMT+00:00 2019, , , , ]
[19-01-22 02:24:40:857 PST] **BREACHED** | [Frodo Baggins, , , Test Due Date 3, , Small Dev, I&S, Development, Mon Jan 14 00:00:00 GMT+00:00 2019, , , , ]
以上面的日志为例,达斯·维德将收到一封包含2条警报内容的电子邮件。佛罗多将收到一封包含4条警告内容的电子邮件。有人能告诉我如何最好地实现这一点吗

更新1

根据下面cen0r中的代码,我已调整以使用GAS

function mailBot() {
  var warningDays = 14;
  var data = cwSheet.getDataRange().getValues();
  var today = new Date();

  // Parse the data using custom function
  var parsed = parseData(data);

  // Filter entries that are breached
  var breached = parsed.filter(function(entry) {
    return dateDiff(entry.date, today) >= 1;
  });

  // Group breached entries by user and do something with them
  groupBy(breached, "user").map(function(group) {
    // Here group is an array of entries for one user
    // You can send one email for all breached entries here
  });

  // Filter entries that are due
  var due = parsed.filter(
    function(entry) {
      return (
        dateDiff(today, entry.date) <= warningDays &&
        dateDiff(entry.date, today) < 1
      );
    } // This is so there won't be 2 emails sent for breached & due
  );

  // Group due entries by user and do something with them
  groupBy(breached, "user").map(function(group) {
  Logger.log(group)
    // Here group is an array of entries for one user
    // You can send one email for all due entries here
  });
}

// Parses the data from your input
function parseData(data) {
  // Parse the data
  var parsed = data.slice(1).map(function(row) {
    var user = row[0];
    var userEmail = buildMailAddress(user);
    var today = new Date();
    var projectName = row[3];
    var date = new Date(row[8]);

    return {
      user: user,
      userEmail: userEmail,
      projectName: projectName,
      date: date,
      today: today
    };
  });

  // Filter entries that you want to do something with
  return parsed.filter(function(entry) {
    return (
      entry.user !== "" &&
      entry.user !== "Unassigned" &&
      entry.user !== "Proof of Concept"
    );
  });
}

// Groups array entries according to a property of the entry (the key)
function groupBy(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
}

基本上,当foreach循环完成时,此日志可用,因此您需要在循环外部创建一个对象(具有两个属性名称和消息数组),并将此日志信息填入其中。在填充时,您可以检查该用户是否存在,然后在此循环之后,您可以轻松地向用户发送邮件


否则,您需要使用jquery库,我不确定您是否愿意使用它们。

我建议首先返回一组解析数据,然后对它们进行搜索,最后发送电子邮件。请注意,我使用了一些ES6语法,如果这对您不起作用,我可以调整它。像这样:

// Parses the data from your input
function parseData(data) {

    // Parse the data
    var parsed = data.slice(1).map(function(row) {
        var user = row[0];
        var userEmail = buildMailAddress(user);
        var projectName = row[3];
        var date = new Date(row[8]);

        return {
            "user": user, 
            "userEmail": userEmail, 
            "projectName": projectName,
            "date": date,
            "today": today
        };
    )};

    // Filter entries that you want to do something with
    return parsed.filter(entry =>
        entry.user !== "" &&
        entry.user !== "Unassigned" &&
        entry.user !== "Proof of Concept"
    );
};

// Groups array entries according to a property of the entry (the key)
function groupBy(xs, key) {
    return xs.reduce(function(rv, x) {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
    }, {});
};

function mailBot() {
    var warningDays = 14;
    var data = cwSheet.getDataRange().getValues();
    var today = new Date();

    // Parse the data using custom function
    var parsed = parseData(data);

    // Filter entries that are breached
    var breached = parsed.filter(funciton(entry) {
        return dateDiff(entry.date, today) >= 1;
    });

    // Group breached entries by user and do something with them
    var breachedGroup = groupBy(breached,"user");
    Object.keys(breachedGroup).forEach(function (key) {
        var group = breachedGroup[key];
        // Here group is an array of entries for one user
        // You can send one email for all breached entries here
        console.log(g[key]);
    })

    // Filter entries that are due
    var due = parsed.filter(function(entry) { 
        return dateDiff(today, entry.date) <= warningDays &&
        dateDiff(entry.date, today) < 1 // This is so there won't be 2 emails sent for breached & due
    });

    // Group due entries by user and do something with them
    var dueGroup = groupBy(due,"user");
    Object.keys(dueGroup).forEach(function (key) {
        var group = dueGroup[key];
        // Here group is an array of entries for one user
        // You can send one email for all breached entries here
    });
};
//从输入中解析数据
函数解析数据(数据){
//解析数据
var parsed=data.slice(1.map)(函数(行){
var user=行[0];
var userEmail=buildMailAddress(用户);
var projectName=行[3];
var日期=新日期(第[8]行);
返回{
“用户”:用户,
“userEmail”:userEmail,
“项目名称”:项目名称,
“日期”:日期,
“今天”:今天
};
)};
//筛选要处理的条目
返回已解析的.filter(条目=>
entry.user!==“”&&
entry.user!=“未分配”&&
entry.user!=“概念证明”
);
};
//根据项(键)的属性对数组项进行分组
函数groupBy(xs,键){
返回x.reduce(功能(rv,x){
(rv[x[键]]=rv[x[键]| |[])。按(x);
返回rv;
}, {});
};
函数mailBot(){
var warningDays=14;
var data=cwSheet.getDataRange().getValues();
var today=新日期();
//使用自定义函数解析数据
var parsed=parseData(数据);
//筛选违反的条目
var breaked=parsed.filter(函数(条目){
返回日期差异(entry.date,today)>=1;
});
//该组违反了用户的条目,并对其进行了处理
var breakedgroup=groupBy(违反“用户”);
Object.keys(breakedGroup).forEach(函数(键){
var group=BreakedGroup[key];
//这里的组是一个用户的条目数组
//您可以在此处发送一封针对所有违规条目的电子邮件
console.log(g[key]);
})
//筛选到期的条目
var due=parsed.filter(函数(条目){

return dateDiff(今天,entry.date)箭头语法不可用。但其余的都可用。不幸的是,GAS不支持ES6(现在)。请您调整一下好吗?我有这个,使用Babel反编译ES6.Aha,对我做过的一些测试得到了类似的响应—“TypeError:在object[object]中找不到函数映射”'用正在使用的代码更新我的原始问题。哇,很抱歉。我忘记了groupBy在这里是如何工作的。我在代码中修复了它。我还删除了箭头语法。这应该可以在简单对象
{}中工作
不是一个
数组
。因此,这是一个错误。如果你有第二个问题,你不应该劫持你的第一个问题。你应该先做必要的研究和实验,并且只在必要时问一个新问题。如果你对给出的答案有疑问,你应该对该答案发表评论。
// Parses the data from your input
function parseData(data) {

    // Parse the data
    var parsed = data.slice(1).map(function(row) {
        var user = row[0];
        var userEmail = buildMailAddress(user);
        var projectName = row[3];
        var date = new Date(row[8]);

        return {
            "user": user, 
            "userEmail": userEmail, 
            "projectName": projectName,
            "date": date,
            "today": today
        };
    )};

    // Filter entries that you want to do something with
    return parsed.filter(entry =>
        entry.user !== "" &&
        entry.user !== "Unassigned" &&
        entry.user !== "Proof of Concept"
    );
};

// Groups array entries according to a property of the entry (the key)
function groupBy(xs, key) {
    return xs.reduce(function(rv, x) {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
    }, {});
};

function mailBot() {
    var warningDays = 14;
    var data = cwSheet.getDataRange().getValues();
    var today = new Date();

    // Parse the data using custom function
    var parsed = parseData(data);

    // Filter entries that are breached
    var breached = parsed.filter(funciton(entry) {
        return dateDiff(entry.date, today) >= 1;
    });

    // Group breached entries by user and do something with them
    var breachedGroup = groupBy(breached,"user");
    Object.keys(breachedGroup).forEach(function (key) {
        var group = breachedGroup[key];
        // Here group is an array of entries for one user
        // You can send one email for all breached entries here
        console.log(g[key]);
    })

    // Filter entries that are due
    var due = parsed.filter(function(entry) { 
        return dateDiff(today, entry.date) <= warningDays &&
        dateDiff(entry.date, today) < 1 // This is so there won't be 2 emails sent for breached & due
    });

    // Group due entries by user and do something with them
    var dueGroup = groupBy(due,"user");
    Object.keys(dueGroup).forEach(function (key) {
        var group = dueGroup[key];
        // Here group is an array of entries for one user
        // You can send one email for all breached entries here
    });
};