#google-apps-script #google-sheets #google-sheets-formula
#google-apps-script #google-sheets #google-sheets-формула
Вопрос:
Я хочу создать скрипт Google, который позволит мне перечислить следующее в отдельной электронной таблице (в столбцах):
- столбец A, получите имя всех электронных таблиц в данной папке
- столбец B, получите URL-адрес указанных электронных таблиц
- В столбце C найдите последнюю ячейку первого листа в каждой электронной таблице
- В столбце D создайте формулу importrange с приведенной выше информацией
Ключевая информация: все электронные таблицы содержат только один лист. На этих листах нет пустых строк, и все они имеют одинаковое количество столбцов.
Я выполнил столбцы A и B. Однако я понятия не имею, как получить последнюю из каждой электронной таблицы. Я предполагаю, что столбец D будет легче записать, поскольку единственной переменной в формуле для importrange является lastBelow — это то, что у меня есть:
function gatheredInfo(){
var result = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var folder = DriveApp.getFolderById('FOLDERID');
var list = [];
list.push(['Name','URL']);
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
var row = []
row.push(file.getName(),file.getUrl())
list.push(row);
}
result.getRange(1,1,list.length,list[0].length).setValues(list);
}
Любая помощь / рекомендации искренне приветствуются. Я застрял на этом некоторое время.
Ответ №1:
Чтобы перейти к «последней ячейке», вам нужно указать скрипту открывать каждую электронную таблицу, пока вы находитесь в цикле «while», и для этого вы можете использовать lastrow и lastcolumn .
Редактировать примечание* В зависимости от того, что вы на самом деле подразумеваете под «последней ячейкой» и как структурированы ваши данные, вам может потребоваться настроить поиск ячейки и обозначения.. но это приведет вас к правильной части вашего кода и концепции*
Это раздел, который я добавил для этого в ваш код…
//Checks if the file type is a Google Sheet
if(DriveApp.getFileById(fileID).getMimeType() == MimeType.GOOGLE_SHEETS){
//Gets the current spreadsheet and first sheet to open to look for the last column and row
var CurrSheet = SpreadsheetApp.openById(fileID).getSheets()[0];
//find last row, column, and put that into A1 notation
var lastrow = CurrSheet.getLastRow();
var lastColumn= CurrSheet.getLastColumn();
//if you don't need A1 notation then this will spit out the row number and the column number.. this next line is what gives you A1 most easily.
var lastcell = CurrSheet.getRange(lastrow,lastColumn).getA1Notation();
var row = []
row.push(file.getName(),file.getUrl(),lastcell);
list.push(row);
}
Сначала я добавил проверку, чтобы убедиться, что файл в папке является Google Sheet (это mime-тип). Это поможет вам предотвратить ошибки, если что-то, что не является таблицей Google, попадет в эту папку.
Затем мы открываем лист с помощью fileID, который вы уже установили. Я по умолчанию установил это для первого листа в каждой электронной таблице (это this part .getSheets()[0] ). Вы сказали, что у вас есть только один лист, но просто вставьте.
Затем используйте это, чтобы получить последнюю строку и последний столбец, и я объединил их в поддельный диапазон, чтобы быстрее перевести его в формат A1. Затем это просто помещается в последний столбец вашего уже установленного массива.
Вот весь код. Я тестировал с папкой, которая у меня есть, со смешанными типами файлов, и она работает правильно.
function gatheredInfo(){
var result = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var folder = DriveApp.getFolderById('FOLDERID');
var list = [];
list.push(['Name','URL','Cell']);
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
var fileID = file.getId();
//Checks if the file type is a Google Sheet
if(DriveApp.getFileById(fileID).getMimeType() == MimeType.GOOGLE_SHEETS){
//Gets the current spreadsheet and first sheet to open to look for the last column and row
var CurrSheet = SpreadsheetApp.openById(fileID).getSheets()[0];
//find last row, column, and put that into A1 notation
var lastrow = CurrSheet.getLastRow();
var lastColumn= CurrSheet.getLastColumn();
//if you don't need A1 notation then this will spit out the row number and the column number.. this next line is what gives you A1 most easily.
var lastcell = CurrSheet.getRange(lastrow,lastColumn).getA1Notation();
var row = []
row.push(file.getName(),file.getUrl(),lastcell);
list.push(row);
}
}
result.getRange(1,1,list.length,list[0].length).setValues(list);
}
Что касается создания формулы importrange, вы можете сделать это в самом листе с помощью формулы или в скрипте приложения, просто введя текстовую строку, которая объединяет все эти переменные.
Однако я не включил это, потому что у меня нет всей информации для составления успешной формулы importrange(). Вам нужен URL-адрес, имя листа и диапазон, и я не знаю, какие у вас имена листов или совпадают ли они. Если вам это тоже нужно, вы можете добавить это прямо под переменной CurrSheet (var SheetName=CurrSheet.getSheetName();). Это даст вам имя первого листа в вашей электронной таблице, из которого вы извлекаете информацию о ячейке. Вы можете просто проанализировать это в своем скрипте приложения, чтобы либо вывести предложенную формулу importrange(), либо поместить ее в качестве собственного столбца, чтобы использовать формулу на листе.
Если вам нужна более подробная информация об этом, дайте мне знать. Я просто не хотел слишком много предполагать о вашей ситуации.
Комментарии:
1. Большое вам спасибо! Ваши изменения направили меня в правильном направлении. Я применил изменения, которые вы отметили, за исключением последней ячейки. Я понял, что последняя ячейка не была выбрана, потому что она была пустой. Однако последней строки в первом столбце не было, и это число — именно то, что мне нужно. Как вы упоминали ранее, я думаю, что в конечном итоге я могу ввести текстовую строку, чтобы перечислить формулу. Еще раз, tysm; Я застрял на несколько дней, так как видел другие примеры перебора файлов, но не мог собрать их воедино.