Как я могу собрать все данные в электронной таблице Google и затем очистить их после запуска сценария? - PullRequest
0 голосов
/ 16 мая 2019

Я создаю сценарий, который будет захватывать все непрочитанные электронные письма, перемещать тела этих электронных писем в электронную таблицу Google, передавать все эти данные в Slack через webhook, а затем очищать лист.

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

var SEARCH_QUERY = "label:inbox is:unread to:me";

function getEmails_(q) {
    var emails = [];
    var threads = GmailApp.search(q);
    for (var i in threads) {
        var msgs = threads[i].getMessages();
        for (var j in msgs) {
            emails.push([msgs[j].getBody().replace(/<.*?>/g, '\n')
                .replace(/^\s*\n/gm, '').replace(/^\s*/gm, '').replace(/\s*\n/gm, '\n')
            ]);
        }
    }
    return emails;
}

function appendData_(sheet, array2d) {
    sheet.getRange(sheet.getLastRow() + 1, 1, array2d.length, array2d[0].length).setValues(array2d);
}

function saveEmails() {
    var array2d = getEmails_(SEARCH_QUERY);
    if (array2d) {
        appendData_(SpreadsheetApp.getActiveSheet(), array2d);
    }
}

function postToSlack() {
    var url = "SLACK WEBHOOK URL HERE";
    var sheet = SpreadsheetApp.getActiveSheet();
     // This represents ALL the rows
    var range = sheet.getDataRange();
    var values = range.getValues();
    for (var i = 0; i < values.length; i++) {
    var row = [];
    for (var j = 0; j < values[i].length; j++) {
     if (values[i][j]) {
       row.push(values[i][j]);
     }
   }
   Logger.log(row);

    var str = values;
    var payload = {
        "text": str  
    }



    var post = {
        "method": "post",
        "payload": JSON.stringify(payload)

    };



    return UrlFetchApp.fetch(url, post);
}

}

Я ожидаю, что данные в ячейках будут выталкиваться прямо в Slack, но ничего не происходит. Когда я запускаю журналы для строк, которые он находит, он также не выводит данные.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я понял это! Требуется команда toString (). Следующее работает отлично, за исключением того, что оно не очищает лист в конце. Он будет очищен, только если запущена отдельная функция.

var SEARCH_QUERY = "label:inbox is:unread to:me";
var url = "SLACK WEBHOOK URL";

function getEmails_(q) 
{
    var emails = [];
    var threads = GmailApp.search(q);
    for (var i in threads) {
        var msgs = threads[i].getMessages();
        for (var j in msgs) 
        {
          emails.push([msgs[j].getPlainBody().replace(/<.*?>/g, '\n')
                .replace(/^\s*\n/gm, '').replace(/^\s*/gm, '').replace(/\s*\n/gm, '\n')]);
            msgs[j].markRead();   
        }
    }
      return emails;
}

function appendData_(sheet, array2d) {
    sheet.getRange(sheet.getLastRow() + 1, 1, array2d.length, array2d[0].length).setValues(array2d);
}

function saveEmails() {
    var array2d = getEmails_(SEARCH_QUERY);
    if (array2d) {
        appendData_(SpreadsheetApp.getActiveSheet(), array2d);
}
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getDataRange();
    var values = range.getValues();
    var row = [];
    for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {
     if (values[i][j]) {
       row.push(values[i][j]);
     }
    }

   }
   Logger.log(row);

    var str = values.toString();
    var payload = {
        "text": str  
    }



//    var post = {
//        "method": "post",
//        "payload": JSON.stringify(payload)
//      
//    };



//    return UrlFetchApp.fetch(url, post); 




function clear() {
  var app = SpreadsheetApp;
  var sheet = app.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange("A1:A40").clearContent();}




  }
0 голосов
/ 17 мая 2019

Редактировать: в добавленном ответе вы можете удалить clear() и добавить sheet.getRange("A1:A40").clearContent(); ниже Logger.log(row);. Другой способ заключается в том, что вы также можете вынуть clear() из saveEmails() и позвонить вот так:

function saveEmails() {
var array2d = getEmails_(SEARCH_QUERY);
if (array2d) {
    appendData_(SpreadsheetApp.getActiveSheet(), array2d);
}
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
var row = [];
for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {
        if (values[i][j]) {
            row.push(values[i][j]);
        }
    }

}
Logger.log(row);

var str = values.toString();
var payload = {
    "text": str
}

clear();
//    var post = {
//        "method": "post",
//        "payload": JSON.stringify(payload)
//      
//    };


//    return UrlFetchApp.fetch(url, post); 
}

function clear() {
    var app = SpreadsheetApp;
    var sheet = app.getActiveSpreadsheet().getActiveSheet();
    sheet.getRange("A1:A40").clearContent();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...