Если коротко, то DriveApp позволяет создавать, находить и изменять файлы и папки на Google Диске.
1. Список всех файлов на своем диске
const ss = SpreadsheetApp.getActiveSpreadsheet()
const ws = ss.getSheetByName("Test")
function getFiles(){
const filesArr = []
const files = DriveApp.getFiles();
while(files.hasNext()){
let file = files.next()
filesArr.push([file.getName()])
}
ws.getRange(1,1,filesArr.length,1).setValues(filesArr)
}
Так как файлов на диске потенциально может быть много, гугл скрипт работает через классы итераторов.
Что такое итератор? В гугл скриптах это класс, который позволяет перемещаться (итерироваться) по элементам последовательности, в данном случае — файловой.
FileIterator
В нем всего 3 метода и часто используемые из них следующие два:
- hasNext() — возвращает true определяя, вернет ли вызов next () файл. Если простыми словами, hasNext() перемещается по коллекции объектов «файл» и вызывает next(), который позволяет получить детали «файла».
- next() — получает «файл» и позволяет обращаться к нему методами класса «файл». Если снова простыми словами — получить имя файла, содержимое, дату создания и так далее.
while(files.hasNext()){
let file = files.next()
filesArr.push([file.getName()])
}
Почему я делаю это через массив? Потому что так быстрее. Получение всех имен файлов в массив и вывод массива из 1000 имен файлов на лист гугл таблицы занимает чуть больше 7 секунд, в то время как просто вывод имени файла через appendRow([file.getName()])
— две с половиной минуты.
2. Получение всех папок со своего диска и их id
const ss = SpreadsheetApp.getActiveSpreadsheet()
const ws = ss.getSheetByName("Test")
function getFolders(){
const foldersArr = []
const folders = DriveApp.getFolders();
while(folders.hasNext()){
let folder = folders.next()
foldersArr.push([folder.getName(), folder.getId()])
}
ws.getRange(1, 3, foldersArr.length, foldersArr[0].length).setValues(foldersArr)
}
Подход такой же — через итератор. Только уже не FileIterator, a FolderIterator, с абсолютно аналогичными методами, но уже не для класса «файл», а для класса «папка».
3. Получение всех файлов из определенной папки
const ss = SpreadsheetApp.getActiveSpreadsheet()
const ws = ss.getSheetByName("Test")
function getFilesInFolder(){
const filesInFolderArr = []
const folder = DriveApp.getFolderById("FolderID")
const files = folder.getFiles();
while(files.hasNext()){
let file = files.next();
filesInFolderArr.push([file.getName()])
}
ws.getRange(1,1,filesInFolderArr.length,1).setValues(filesInFolderArr)
}
Совмещаю то, что уже умею из 1 — получения всех файлов и 2 — получения папок. Так как DriveApp условно это «корневая папка», то аналогично можно получать данные и из остальных папок, обращаясь к ним по имени getName("FolderName")
через перебор папок, либо напрямую через getFolderById("FolderID")
.
На этом, пожалуй, все.
В следующей части я рассмотрю создание файлов их конвертацию через blob.