Работаем с файлами в Google Apps Script.
Сегодня мы научимся применять несколько простых скриптов для наведения порядка в облачном хранилище и сбора информации о документах. Даже если вы не имеете привычки использовать сервисы Google, это не значит, что статья будет бесполезной для вас.
Хранимые в Google Drive файлы можно быстро синхронизировать с жестким диском своего компьютера, а через него – с другими облачными сервисами.
Как использовать скрипты из статьи
- Заходим на docs.google.com и авторизируемся;
- Создаем новую таблицу;
- Открываем Инструменты -> Редактор скриптов;
- Копируем в окошко код из примеров и вносим необходимые правки;
- Запускаем скрипт и предоставляем ему все разрешения.
Получаем список файлов на диске
Google Drive появился три года назад. У многих пользователей за этот короткий срок успел образоваться необозримый бардак. Просто у сервиса есть две особенности, которые способствует воцарению хаоса в аккаунте юзера:
- В одном каталоге можно создавать файлы и папки с одинаковыми именами;
- Все документы, которые отправляются по почте, автоматически оказываются на Google Drive.
Этот скрипт просматривает 100 последних измененных файлов на Google Drive и записывает в таблицу имя, дату создания, тип файла, размер, уникальный ID и дату последнего изменения для каждого документа.
С помощью полученной таблицы можно быстро обозреть содержимое диска и отобрать список файлов для дальнейшей обработки (её примеры будут даны ниже).
[jscript]
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());
}
}
[/jscript]
Запустив данный скрипт, вы увидите, что Google Apps Script работает с файлами очень медленно. Каждое заполнение строки таблицы можно отследить визуально. В примерах дается код для обработки только 100 файлов, так просмотр всех документов может несколько десятков минут.
Если вам нужно обработать все документы на диске, необходимо морально подготовиться и вместо 100-кратной итерации использовать другой способ перебора файлов:
[jscript]
files = DriveApp.getFiles();
while (files.hasNext())
{
}
[/jscript]
Узнаем, кто имеет доступ к файлам
Для каждого файла на Google Drive можно указать конкретных пользователей, которые имеют право на просмотр, а также тех, кто имеет право на редактирование. Этот скрипт поможет автоматически отобразить в ячейках таблицы список представителей обоих категорий:
[jscript]
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);
}
}
}
[/jscript]
Проверяем, нет ли файлов в общем доступе
Файлам на Google Drive можно присваивать различные типы прав доступа: «доступен только владельцу», «доступен приглашенным пользователям», «доступен всем у кого есть ссылка» и «доступен всем в интернете». Если у документа настроить последний тип прав (а это легко сделать по неосторожности), то он попадет в поисковую выдачу Google. Случайные люди смогут его найти и просмотреть.
Проверить, нет ли таких в вашем хранилище, можно с помощью этого скрипта:
[jscript]
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++;
}
}
}
[/jscript]
Предоставляем пользователю доступ к файлам
Иногда бывают ситуации, когда человеку необходимо предоставить доступ к нескольким десяткам документов, лежащим в разных папках. Делать это вручную долго и неудобно. Лучше получить список всех файлов первым примером кода в статье (чтобы в столбце E были ID документов), по-быстрому выбрать из них нужные и пройтись по ним этим скриптом:
[jscript]
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 protected]")
}
}
[/jscript]
Решаем пользователя доступа к файлам
Бывает и обратная ситуация. К примеру, когда сотрудник увольняется из компании, надо резко лишить его доступа ко всем рабочим документам. Для этого применяется скрипт, обратный вышеприведенному.
В этом случае необходимо убедиться, что в столбце E есть уникальные идентификаторы документов.
[jscript]
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 protected]");
}
}
[/jscript]
Создаем новые папки
Довольно удобный способ хранения файлов — разложить их по временным периодам. Этот скрипт создаст папки для разных годов и положит в них файлы с соответствующей датой создания:
[jscript]
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);
}
}
}
}
[/jscript]
Если знаете другие полезные скрипты для Google Drive, пишите их в комментариях, спасибо!
- 4 лайфхака Gmail и Google Apps Script
- Автоматизируем Google Таблицы на Google Apps Script
- Google Apps Script для Docs в примерах
- Планируем жизнь с Google Calendar и Google Apps Script

12 комментариев
Форум →И что там обычно хранят ?
@Майор, то же что и в Dropbox + созданное в Google Docs, Google Презентации, формы для сбора данных и т.д.
@Ирина Чернова, А как же OneDrive? В нем не удобней?
@Майор, для тех у кого на Windows телефон, планшет и компьютер – OneDrive удобнее безусловно) И там тоже можно писать автоматизации на Power Shell))) А я вот большая поклонница сервисов Google)
Полезно, надо опробовать.
@shelphur, go ahead:-)
С++ для начинающих
@Sergey Zverev, скорее «JavaScript для младших школьников»
как сохранить копию текущего файла с названием взятым из ячейки?
в паку название которой взято из ячейки(если такой нет создать?
сейчас Я набросал функцию
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var xx = sheet.getRange(“C21”).getValue();
var source = SpreadsheetApp.getActive();
var targetFolder = DriveApp.getFoldersByName(“папка”);
var newFile = source.copy(xx);
newFile.addToFolder(targetFolder);
}
она создаёт копию файла, с именем из ячейки, в корне гугл диска, и так как функция создана внутри файла она не имеет прав на перенос других файлов в другое место…
как создать файл сразу в нужной директории?
Спасибо, полезно.
@Ирина Чернова, а как получить список файлов в папке с определённым именем?
@Ирина Чернова, если в скрипте “Узнаем, кто имеет доступ к файлам” ищу не по 100 последним файлам, а по всем (“for(i=1;i<=100;i++)" заменил на "while (files.hasNext())"), то "Превышено максимально допустимое время выполнения".
Это время можно увеличить?
Нашли орфографическую ошибку в новости?
Выделите ее мышью и нажмите Ctrl+Enter.Как в macOS закрепить любую заметку поверх всех окон
iPhone постоянно требует обновления настроек оператора, что делать?
Какой блок питания подойдет для быстрой зарядки MacBook Pro
Шпионское приложение, которое снимет на фото всех, кто захочет зайти в ваш iPhone или iPad без разрешения
Почему в iOS 16 не работает выделение и копирование объектов на фотографиях
Как в macOS Sonoma отключить новый индикатор переключения языка
Как на Mac устанавливать игры из Steam на внешний диск
Почему в некоторых приложениях не работает микрофон