Я хочу создать скрипт Google, который позволяет мне перечислить следующее в отдельной таблице (в столбцах):
Ключевая информация: все электронные таблицы состоят только из одного листа. На этих листах нет пустых строк, и все они имеют одинаковое количество столбцов.
Я выполнил столбцы 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);
}
Любая помощь/руководство искренне приветствуется. Я застрял на этом некоторое время.
Чтобы добраться до «последней ячейки», вам нужно сообщить сценарию, чтобы он открывал каждую электронную таблицу, пока вы находитесь в цикле «пока», и вы можете использовать для этого последнюю строку и последний столбец.
Редактировать примечание * В зависимости от того, что вы на самом деле подразумеваете под «последней ячейкой» и как структурированы ваши данные, вам может потребоваться настроить поиск ячейки и обозначение ... но это приведет вас к правильной части вашего кода и концепции *
Это раздел, который я добавил, чтобы сделать это в вашем коде...
//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, попадет в эту папку.
Затем мы открываем лист по идентификатору файла, который вы уже установили. По умолчанию это первый лист в каждой электронной таблице (это часть .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(), либо поместить ее как собственный столбец, чтобы использовать формулу на листе.
Если вам нужна более подробная информация об этом, дайте мне знать. Я просто не хотел слишком много думать о твоей ситуации.
Большое спасибо! Ваши модификации направили меня в правильном направлении. Я применил отмеченные вами изменения, за исключением последней ячейки. Я понял, что последнюю ячейку не брали, потому что она была пуста. Однако последней строки в первом столбце не было и это число как раз то, что мне нужно. Как вы упоминали ранее, я думаю, что могу в конечном итоге нажать текстовую строку, чтобы вывести формулу. Еще раз тысм; Я застрял на несколько дней, так как видел другие примеры циклического просмотра файлов, но не мог собрать их воедино.