Не Удается Прочитать Диапазон Листов От Нуля

#javascript #google-apps-script #google-sheets

Вопрос:

У меня есть функция, которая позволяет мне импортировать данные электронных таблиц из моего gmail в Google таблицы. Ранее для импорта данных электронной таблицы требовалось всего 6 столбцов. Теперь внесены некоторые новые изменения и добавлена 7-я колонка. После того, как это изменение было реализовано, моя функция больше не работает, и Google Sheets выдает эту ошибку. Могу ли я, пожалуйста, получить некоторую помощь?

Итак, когда я смотрю на это, предполагаемая функциональность кажется мне правильной. Пропустите первые 3 строки ( netdata ) и возьмите все, что ниже. Может ли это быть 1, 1 так ?

Ошибка:

 TypeError: Cannot read property 'getRange' of null
 

Моя функция импорта:

 function importCSVFromGmail() {
  var sheetName = "SHEET_NAME"; // Name of sheet tab. 
  var threads = GmailApp.search("from:EMAIL HERE label:LABEL HERE"); // "from:recipient email here label:name of your filter/label here"


  var messages = threads[0].getMessages();
  var message = messages[messages.length - 1];
  var attachment = message.getAttachments()[0]; // [0] will by default look for only 1 attachment. If there are more than two attachment increase value. ex: [1] , [2] 

  var data = [];
  if (attachment.getContentType() == MimeType.CSV) { // This will look for a CSV file type first
    data = Utilities.parseCsv(attachment.getDataAsString(), ",");

  } else if (attachment.getContentType() == MimeType.MICROSOFT_EXCEL || attachment.getContentType() == MimeType.MICROSOFT_EXCEL_LEGACY) { // If attachment is an xls, this line will look at the content to determine and convert accordingly.

    var tempFile = Drive.Files.insert({title: "temp", mimeType: MimeType.GOOGLE_SHEETS}, attachment).id;

    data = SpreadsheetApp.openById(tempFile).getSheets()[0].getDataRange().getValues();
    Drive.Files.trash(tempFile);
  }
  if (data.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
    var netdata = data.slice(3); // This will skip the number of rows starting from the top.
    sheet.getRange(sheet.getLastRow()   1, 1, netdata.length, netdata[0].length).setValues(netdata );
  }
}
 

Я думаю, что проблема здесь:

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

Комментарии:

1. Я не уверен, но, возможно, после того, как вы откроете временный файл, он станет активной электронной таблицей. А потом ты выкидываешь его в мусорное ведро. Затем вы вызываете activeSpreadsheet и не получаете его, потому что он удален. Попробуйте переместить линию var sheet=activeSpreadsheet... вверх. Прежде чем открывать и удалять другую электронную таблицу.

2. Я не думаю, что это было бы проблемой, поскольку это часть преобразования, которое необходимо осуществить. Как уже говорилось, это уже работало, когда во вложении электронной таблицы было всего 6 столбцов. Теперь, когда есть 7 столбцов, я не понимаю, как наличие дополнительного столбца повлияло на этот код.

3. Я только что попробовал ваш скрипт, и он отлично работает для любого количества столбцов в файле Excel. Я пробовал форматы xls и xlsx. С вашими файлами Excel может быть что-то не так. Но, скорее всего, это действительно просто неправильное название листа.

Ответ №1:

Сообщение об ошибке указывает на то, что проблема заключается в sheet том, что переменная имеет значение null. Это происходит, когда в электронной таблице нет листа с именем SHEET_NAME .

Чтобы исправить ошибку, SHEET_NAME замените ее именем листа, с которым вы хотите, чтобы функция работала. Проверьте наличие таких вещей, как начальные и конечные пробелы в названии листа.