Как отправить данные из gmail на разные листы по дате? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть скрипт, который запускается на листе Google, который анализирует электронную почту и создает новые строки на листе.Это используется для создания файла журнала из периодически обновляемых обновлений журнала.Это работает очень хорошо.

В настоящее время у меня есть переменная, которая используется для определения, какие электронные письма поступают на основе месяца (0 = январь и т. Д.)

Эта переменная должна быть скорректированакаждый месяц, а затем я должен создать новый ежемесячный лист (вкладка в основном) и выполнить сортировку и перемещение писем в gmail.

Я бы хотел настроить это так, чтобы он автоматически помещал январьэлектронные письма на листе за январь и февральские электронные письма на листе за февраль.

Я думал о каскадировании операторов ififif, но это стало слишком громоздким.

Я думал об итерации с использованием forперебирайте массив, содержащий все электронные письма, но это тоже кажется запутанным.

Есть предложения?

:: EDIT :: Чтобы быть понятным, мне действительно интересно, как разобрать всеэлектронные письма и отправьте их с января на январский лист (например).

:: EDIT :: Добавлен текущий скрипт


    function myFunction() {
        var label = GmailApp.getUserLabelByName(myLabel);
        var label2 = GmailApp.getUserLabelByName(newLabel);
        var threads = label.getThreads();
        var data = new Array();
        var newData = new Array();

        // get all the email threads matching myLabel
        for (var i = 0; i < threads.length; i++) {
            var messages = GmailApp.getMessagesForThread(threads[i]);

            // archive thread
            label2.addToThread(threads[i]);
            label.removeFromThread(threads[i]);

            // get each individual email from the threads
            for (var j = 0; j < messages.length; j++) {
                var bodyText = messages[j].getPlainBody();

                // split the email body into individual "paragraph" strings based on the regExp variable
                while (matches = regExp.exec(bodyText)) {
                    var logdata = matches[1];
                    for (k in keys) {
                        logdata = logdata.replace(keys[k], "");
                    }

                    // split out each "paragraph" string into an array
                    var lines = logdata.split(/[\r\n]+/);
                    for (l in lines) {
                      lines[l] = lines[l].replace('*F','');
                      lines[l] = lines[l].trim();
                    }
                    for (l in lines) {
                        lines[l] = lines[l].replace(/^(\:\s)/, "");
                    }

                    // Turn the first element in the array into a date element, format it, and put it back
                    lines[0] = Utilities.formatDate(new Date(lines[0]), "America/Phoenix", "M/d/yy HH:mm:ss");

                    // Put the array to a new item in the data array for further processing
                    if (curMonth == (new Date(lines[0]).getMonth())) {
                        data.push(lines);
                    }
                }
            }
        }
        // Compare the information in the data array to oldData information in the sheet
      if (data.length) {
        var oldData = s.getRange(range).getValues();
        for (h in oldData) {
          oldData[h][0] = Utilities.formatDate(new Date(oldData[h][0]), "America/Phoenix", "M/d/yy HH:mm:ss");
        }
        for (i in data) {
          var row = data[i];
          var duplicate = false;
          for (j in oldData) {
            if (row.join() == oldData[j].join()) {
              duplicate = true;
            }
          }
          if (!duplicate) {
            newData.push(row);
          }
        }
        // check to write newData only if there is newData, this stops an error when newData is empty
        if (newData.length) {
          s.getRange(s.getLastRow() + 1, 1, newData.length, newData[0].length).setValues(newData);
        }
        s.getRange(range).sort(1); //sorts the sheet
      }
    }

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я закончил тем, что основывал свое решение на решении, предоставленном @cooper, но мне пришлось пойти немного дальше.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var month = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var curMonth = new Date().getMonth(); //number of month -1 aka: January = 0
var sheetname = month[curMonth] + " " + new Date().getYear();
var s = ss.getSheetByName(sheetname);

function newMonth(){
  if (!s) {
    var template = ss.getSheetByName('Template').copyTo(ss);
    template.setName(sheetname);
    s = ss.getSheetByName(sheetname); //"reload" the sheet
    s.showSheet(); //unhide the new copy since 'Template' is hidden in the spreadsheet
    ss.setActiveSheet(s);  //make it active
    ss.moveActiveSheet(0); //move it to the first position
  }
}
0 голосов
/ 04 июня 2019

Попробуйте это:

function getSheet(date) {
  var ss=SpreadsheetApp.openById('SpreadsheetId');
  var name=Utilities.formatDate(new Date(date), Session.getScriptTimeZone(), "MMMyyyy")
  var sh=ss.getSheetByName(name);
  if(!sh) {
    var sh=ss.insertSheet(name);
  }
  return sh;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...