Google Drive: начало работы с DriveApp.

Если коротко, то 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.

Добавить комментарий