Во-первых, я буду честен с тобой.Я действительно новичок в написании скриптов и JavaScript.Я думаю, что я достаточно талантлив, чтобы понять, что я делаю, все же.
Я внештатный сотрудник, и я управляю всеми своими счетами с помощью пакета документов Google в Sheets.Итак, у меня есть папка на моем диске, которая содержит все мои Счета в виде отдельных электронных таблиц, и у меня также есть другая отдельная электронная таблица для отчетов, которая находится в другой папке.Лист отчетов получает свои данные непосредственно из листов счетов, используя функцию IMPORTRANGE.До сих пор я всегда все настраивал вручную в отчете.Я пытаюсь автоматически добавлять новые строки в отчет по мере добавления нового счета в папку.
Я нашел скрипт, который, кажется, выполняет то, что я хочу, но нене работает после того, как я изменил его.Первоначально был создан скрипт для получения адресов электронной почты из листов Google и автоматического импорта их в один мастер-лист.
Я пытался изменить его для своих нужд, но получаю сообщение об ошибке.
Код, который янайдено с форума Google.Запрос был: «Я хочу автоматически извлекать столбец адресов электронной почты из листа Google каждый раз, когда он добавляется на мой диск Google. Это вообще возможно? В настоящий момент лист начинается как лист Excel, но преобразуетсяна лист Google при загрузке через синхронизацию Multcloud. Я знаю, что могу использовать команду importrange с ключом листов, чтобы импортировать нужный диапазон из этого конкретного листа, но есть ли способ получить ключ новых загруженных листов иимпортировать эти диапазоны также?
Если нет, кто-нибудь может придумать лучший способ импортировать диапазон в один и тот же лист каждый раз, когда на диск добавляется новый лист. "
и ответбыло: «Я настроил сценарий, который я использовал для чего-то похожего, что, надеюсь, делает то, что вы ищете. Прежде чем использовать его, создайте папку, в которую вы будете загружать все свои таблицы. Получите идентификатор папкиэто и вставьте его в код, где я прокомментировал. Затем используйте скрипт ниже на листе, где вы быКе, чтобы извлечь все ваши адреса электронной почты.Примечание: я предположил, что электронные письма хранятся в столбце А, если это не так, просто измените код в соответствии с требованиями.Код создает два новых листа, один для электронных писем и один для URL-адресов файлов в папке.Письма добавляются по одному столбцу за раз.Каждый столбец соответствует электронной таблице в папке.URL-адреса сохраняются, чтобы при повторном запуске дубликаты не создавались.Есть одна проблема - вы должны «соединить листы» вручную после выполнения кода.На данный момент кажется, что этого избежать невозможно, но это не займет много времени. "
С исходным кодом:
function emailAddressExtractor() {
// Change folder ID to match yours. Upload your spreadsheets (with the email addresses) into this folder.
var folder = DriveApp.getFolderById("1j3GZqUgVOwywARvKyRJnj6p_gLNMCk__");
var files = folder.getFiles(), file;
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Creates sheets for "Email Addresses" and "List of URLs", unless they exist already
if (ss.getSheetByName("Email Addresses") == null) {
var create = ss.insertSheet("Email Addresses");
}
if (ss.getSheetByName("List of URLs") == null) {
var create = ss.insertSheet("List of URLs");
}
// Variables to make setting active sheet easier
var emailAddressesSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Email Addresses"));
var listOfUrlsSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("List of URLs"));
// Finds last rows and columns of emails and URLs, so that they are not overwritten later by new emails and URLs
var oldUrls = listOfUrlsSheet.getRange("A1:A").getValues();
var oldUrlsLength = oldUrls.filter(String).length +1;
var oldEmails = emailAddressesSheet.getRange("1:1").getValues();
var oldUrlsLength = oldEmails.filter(String).length;
// Counts number of files in folder and gets URLs
var urlsList = [];
var counter = 0;
while (files.hasNext()) {
counter++;
file = files.next();
var urls = [];
urls.push(file.getUrl())
urlsList.push(urls);
}
// Finds new URLs by comparing to old ones
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
}
var diff = urlsList.diff(oldUrls); // This is the difference between the old URLs and the new ones
Logger.log("\n" + diff);
for (var i = 0; i < diff.length; i++) { // This loop inserts the new URLs into the spreadsheet. This is done so that the next time the code is run it won't duplicate the emails
var row = i + oldUrlsLength;
var diffRange = listOfUrlsSheet.getRange("A"+row)
diffRange.setValue(diff[i]);
}
// Inserts IMPORTRANGE formula into sheet, taking column A out of each spreadsheet in the designated folder
for (var i = 0; i < counter; i++) {
var fileUrl = urlsList[i];
var cell = emailAddressesSheet.getRange(1, oldUrlsLength+i);
cell.setValue("=IMPORTRANGE(" + '"' + fileUrl + '"' + "," + '"' + "Sheet1!A:A" + '"' + ")" );
}
}
Вот код, который у меня естьизменен теперь, чтобы получить только номер счета:
function dataExtractor() {
// Change folder ID to match yours. Upload your spreadsheets (with the Numbers) into this folder.
var folder = DriveApp.getFolderById("1jH6M0Ijsepe0MnDLULrmfHHJ8R_Fd3-M");
var files = folder.getFiles(), file;
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Creates sheets for "Data" and "List of URLs", unless they exist already
if (ss.getSheetByName("Report") == null) {
var create = ss.insertSheet("Report");
}
if (ss.getSheetByName("List of URLs") == null) {
var create = ss.insertSheet("List of URLs");
}
// Variables to make setting active sheet easier
var reportSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Report"));
var listOfUrlsSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("List of URLs"));
// Finds last rows and columns of Data and URLs, so that they are not overwritten later by new emails and URLs
var oldUrls = listOfUrlsSheet.getRange("A1:A").getValues();
var oldUrlsLength = oldUrls.filter(String).length +1;
var oldNumber = reportSheet.getRange("B7:B").getValues();
var oldUrlsLength = oldNumber.filter(String).length;
// Counts number of files in folder and gets URLs
var urlsList = [];
var counter = 0;
while (files.hasNext()) {
counter++;
file = files.next();
var urls = [];
urls.push(file.getUrl())
urlsList.push(urls);
}
// Finds new URLs by comparing to old ones
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
}
var diff = urlsList.diff(oldUrls); // This is the difference between the old URLs and the new ones
Logger.log("\n" + diff);
for (var i = 0; i < diff.length; i++) { // This loop inserts the new URLs into the spreadsheet. This is done so that the next time the code is run it won't duplicate the emails
var row = i + oldUrlsLength;
var diffRange = listOfUrlsSheet.getRange("A"+row)
diffRange.setValue(diff[i]);
}
// Inserts IMPORTRANGE formula into sheet, taking column A out of each spreadsheet in the designated folder
for (var i = 0; i < counter; i++) {
var fileUrl = urlsList[i];
var cell = rapportSheet.getRange(1, oldUrlsLength+i);
cell.setValue("=IMPORTRANGE(" + '"' + fileUrl + '"' + "," + '"' + "Sheet1!J8" + '"' + ")" );
}
}
Мои номера счетов расположены в ячейке J8 каждого счета, и в отчете они начинаются в ячейке B7, спускаясь вниз по всему столбцу.
Ошибка, которую я получаю от редактора сценариев Google: диапазон не найден (строка 50, файл "Код"). Эта строка будет выглядеть так:ссылка на шаблон счета, который у меня есть: https://docs.google.com/spreadsheets/d/1wE4YtvdwBBiriRcuv-k8oFyKyEuN9SSIuKewf106cdg/edit?usp=sharing
Вот ссылка на шаблон отчета, который я использую: https://docs.google.com/spreadsheets/d/1qScJItssyaxpsqAXVnMMrmUlBYUicAsX7CQZA7ky0Rg/edit?usp=sharing
Идентификатор папки для папки моих счетов-фактур будет выглядеть так:1KlGD5Qj9C5pMrOdHSwkYesK-yyq4udNC
Идентификатор папки для моего отчета будет выглядеть следующим образом: 1q0Ta7h4aQHaemgwlWWMS_5YBa1WH-rSz
Большое спасибо, ребята !!! * 1035