Простые автоматизации для Google Drive
Работаем с файлами в Google Apps Script.
Сегодня мы научимся применять несколько простых скриптов для наведения порядка в облачном хранилище и сбора информации о документах. Даже если вы не имеете привычки использовать сервисы Google, это не значит, что статья будет бесполезной для вас.
Хранимые в Google Drive файлы можно быстро синхронизировать с жестким диском своего компьютера, а через него — с другими облачными сервисами.
Как использовать скрипты из статьи
- Заходим на docs.google.com и авторизируемся;
- Создаем новую таблицу;
- Открываем Инструменты → Редактор скриптов;
- Копируем в окошко код из примеров и вносим необходимые правки;
- Запускаем скрипт и предоставляем ему все разрешения.
Получаем список файлов на диске
Google Drive появился три года назад. У многих пользователей за этот короткий срок успел образоваться необозримый бардак. Просто у сервиса есть две особенности, которые способствует воцарению хаоса в аккаунте юзера:
- В одном каталоге можно создавать файлы и папки с одинаковыми именами;
- Все документы, которые отправляются по почте, автоматически оказываются на Google Drive.
Этот скрипт просматривает 100 последних измененных файлов на Google Drive и записывает в таблицу имя, дату создания, тип файла, размер, уникальный ID и дату последнего изменения для каждого документа.
С помощью полученной таблицы можно быстро обозреть содержимое диска и отобрать список файлов для дальнейшей обработки (её примеры будут даны ниже).
function fileList() { currentSheet = SpreadsheetApp.getActive(); var files = DriveApp.getFiles(); i=1; for(i=1;i<=100;i++) { files.hasNext(); var file = files.next(); currentSheet.getRange("A"+i).setValue(file.getName()); currentSheet.getRange("B"+i).setValue(file.getDateCreated()); currentSheet.getRange("C"+i).setValue(file.getMimeType()); currentSheet.getRange("D"+i).setValue(file.getSize()); currentSheet.getRange("E"+i).setValue(file.getId()); currentSheet.getRange("F"+i).setValue(file.getLastUpdated()); } }
Запустив данный скрипт, вы увидите, что Google Apps Script работает с файлами очень медленно. Каждое заполнение строки таблицы можно отследить визуально. В примерах дается код для обработки только 100 файлов, так просмотр всех документов может несколько десятков минут.
Если вам нужно обработать все документы на диске, необходимо морально подготовиться и вместо 100-кратной итерации использовать другой способ перебора файлов:
files = DriveApp.getFiles(); while (files.hasNext()) { }
Узнаем, кто имеет доступ к файлам
Для каждого файла на Google Drive можно указать конкретных пользователей, которые имеют право на просмотр, а также тех, кто имеет право на редактирование. Этот скрипт поможет автоматически отобразить в ячейках таблицы список представителей обоих категорий:
function filesSharing() { currentSheet = SpreadsheetApp.getActive(); var files = DriveApp.getFiles(); i=1; j=1; for(i=1;i<=100;i++) { editors=0; files.hasNext(); var file = files.next(); currentSheet.getRange("A"+i).setValue(file.getName()); currentSheet.getRange("B"+i).setValue(file.getDateCreated()); currentSheet.getRange("C"+i).setValue(file.getMimeType()); if(file.getEditors().length>0) { for(j=1;j<=file.getEditors().length-1;j++) { editors=editors + ";" + file.getEditors()[j].getEmail(); } currentSheet.getRange("D"+i).setValue(editors); } if(file.getViewers().length>0) { for(j=1;j<=file.getViewers().length-1;j++) { editors=editors + ";" + file.getViewers()[j].getEmail(); } currentSheet.getRange("E"+i).setValue(editors); } } }
Проверяем, нет ли файлов в общем доступе
Файлам на Google Drive можно присваивать различные типы прав доступа: «доступен только владельцу», «доступен приглашенным пользователям», «доступен всем у кого есть ссылка» и «доступен всем в интернете». Если у документа настроить последний тип прав (а это легко сделать по неосторожности), то он попадет в поисковую выдачу Google. Случайные люди смогут его найти и просмотреть.
Проверить, нет ли таких в вашем хранилище, можно с помощью этого скрипта:
function fileAcess() { currentSheet = SpreadsheetApp.getActive(); var files = DriveApp.getFiles(); i=1; j=1; for(i=1;i<=100;i++) { files.hasNext(); var file = files.next(); if (file.getSharingAccess()=="ANYONE") { currentSheet.getRange("A"+j).setValue(file.getName()); currentSheet.getRange("B"+j).setValue(file.getDateCreated()); currentSheet.getRange("C"+j).setValue(file.getMimeType()); currentSheet.getRange("D"+j).setValue(file.getSize()); currentSheet.getRange("E"+j).setValue(file.getSharingAccess()); j++; } } }
Предоставляем пользователю доступ к файлам
Иногда бывают ситуации, когда человеку необходимо предоставить доступ к нескольким десяткам документов, лежащим в разных папках. Делать это вручную долго и неудобно. Лучше получить список всех файлов первым примером кода в статье (чтобы в столбце E были ID документов), по-быстрому выбрать из них нужные и пройтись по ним этим скриптом:
function addEditor() { currentSheet = SpreadsheetApp.getActive(); var files = DriveApp.getFiles(); i=1; for(i=1;i<=10;i++) { id = currentSheet.getRange("E"+i).getValue(); DriveApp.getFileById(id).addEditor("email@example.com") } }
Решаем пользователя доступа к файлам
Бывает и обратная ситуация. К примеру, когда сотрудник увольняется из компании, надо резко лишить его доступа ко всем рабочим документам. Для этого применяется скрипт, обратный вышеприведенному.
В этом случае необходимо убедиться, что в столбце E есть уникальные идентификаторы документов.
function removeEditor() { currentSheet = SpreadsheetApp.getActive(); var files = DriveApp.getFiles(); i=1; for(i=1;i<=100;i++) { id = currentSheet.getRange("E"+i).getValue(); DriveApp.getFileById(id).removeEditor("email@example.com"); } }
Создаем новые папки
Довольно удобный способ хранения файлов — разложить их по временным периодам. Этот скрипт создаст папки для разных годов и положит в них файлы с соответствующей датой создания:
function createFolders() { topFolder = DriveApp.createFolder("Рабочий архив"); for (j=2012;j<=2015;j++) { currentFolder = topFolder.createFolder(i); for(i=1;i<=10;i++) { date = currentSheet.getRange("B"+i).getValue(); if(date.getYear()==j) { id = currentSheet.getRange("E"+i).getValue(); file = DriveApp.getFileById(id); currentFolder.addFile(file); } } } }
Если знаете другие полезные скрипты для Google Drive, пишите их в комментариях, спасибо!