Группировка массива по строке - PullRequest
0 голосов
/ 22 января 2019

Нужна рука, чтобы немного привести в порядок это.У меня есть сценарий (см. Ниже), который просматривает лист Google и проверяет, приближается ли срок выполнения проекта к сроку его исполнения.Эта часть работает.Что мне нужно сделать, это отправить электронное письмо на ресурс, назначенный, когда он приближается или нарушил.Это достаточно просто, 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, , , , ]

Используя приведенный выше журнал в качестве примера, Дарт Вейдер получил бы 1 электронное письмо с содержанием 2 предупреждений.Фродо получит 1 электронное письмо с содержанием 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;
  }, {});
}

Теперь выдается ошибка:

TypeError: Невозможно найти карту функции в объекте [object Object].(строка 25, файл "0 - Main")

, который ссылается на эту строку кода:

groupBy(breached, "user").map(function(group) {
});

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Я предлагаю сначала вернуть массив проанализированных данных, затем объединить их и, наконец, отправить электронные письма. Обратите внимание, что я использовал некоторый синтаксис 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
    });
};
0 голосов
/ 22 января 2019

По сути, этот журнал доступен, когда цикл foreach завершен, поэтому вам нужно создать объект (с двумя свойствами name и массивом сообщений) вне цикла и заполнить эту информацию журнала. При заполнении вы можете проверить, существует ли пользователь в этом или нет, а затем после этого цикла вы можете легко отправлять почту пользователям.

В противном случае вам нужно использовать библиотеки jquery, я не уверен, что вы хотите их использовать или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...