Как добавить CSV-вложения в существующий Google Sheet - PullRequest
1 голос
/ 15 октября 2019

В настоящее время у меня есть функция importCSVFromGmail:

function importCSVFromGmail() {
var threads = GmailApp.search("from:noreply@exacttarget.com");
var message = threads[0].getMessages()[0];
var attachment = message.getAttachments()[0];

// Is the attachment a CSV file
attachment.setContentTypeFromExtension();
if (attachment.getContentType() === "text/csv") {
    var sheet = SpreadsheetApp.getActiveSheet();
    var csvData = Utilities.parseCsv(attachment.getDataAsString(), ",");

    // Remember to clear the content of the sheet before importing new data
    sheet.clearContents().clearFormats();
    sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}
}

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

Я хотел бы знать, можно ли изменить скрипт для импорта всех полученных отчетов from:noreply@exacttarget.com и отображения их всех на одном листе.

Обратите внимание, чтоПервая строка содержит имена строк заголовков и не требуется для каждого CSV-файла.

Любая помощь или советы будут с благодарностью!

1 Ответ

1 голос
/ 15 октября 2019

Вы хотите добавить данные CSV, а не заменять существующие данные.

Удалить эти строки
Ваш код содержит следующие строки, которые необходимо удалить:

  1. sheet.clearContents().clearFormats();

В этой строке удаляются все существующие данные с листа.

sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

Определяет диапазон с ячейкой «A1» в верхнем левом углу, а количество строк и столбцов определяется данными CSV. Используя ячейку A1, данные будут располагаться в верхней части листа.

Заменить на:

var LR = sheet.getLastRow();
sheet.getRange(LR+1, 1, csvData.length, csvData[0].length).setValues(csvData);

LR определяется в последней строке на листе.
Тогда первая строка диапазона - «LR + 1» - строка, следующая сразу за последней строкой.
Таким образом, метод setValues будетдобавьте данные на лист, начиная с первой строки, следующей за «Последней строкой».


Редактировать: Сортировать по отметке времени

Очевидно, вам нужно получитьновая «последняя строка», и я также получаю последний столбец (но это можно использовать повторно из более раннего значения). Это позволяет установить диапазон getRange() - и затем отсортировать (sort) (обратите внимание, что диапазон начинается со строки 2, чтобы избежать заголовков).

FWIW, 1) sort можно объединить в цепочкудо getRange (вырезать две строки). Я не делал этого, но только для того, чтобы я мог продемонстрировать / доказать размеры диапазона. 2) есть команда сортировки для листов, а также для диапазонов - лучше не смешивать их; -)

  var sortLR = sheet.getLastRow();
  var sortLC = sheet.getLastColumn();
  var sortrange = sheet.getRange(2,1,sortLR-1,sortLC);
  // Logger.log("DEBUG: the sort range = "+sortrange.getA1Notation());
  sortrange.sort([{column: 1, ascending: false}]);

Ссылка

Диапазон sort

...