#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
замените ее именем листа, с которым вы хотите, чтобы функция работала. Проверьте наличие таких вещей, как начальные и конечные пробелы в названии листа.