Apps Script - Автоматическое удаление файлов с Google Drive старше 3 дней - Получить список файлов

Я использую Google Drive для хранения записей обнаружения движения с моих IP-камер дома. Я запускаю следующий скрипт (слегка измененный) для автоматического удаления файлов старше 3 дней с моего Google Диска:

Автоматически удалять файлы в Google Drive

Сценарий запускается каждое утро около 5 утра. Проблема, с которой я сталкиваюсь, состоит в том, что, когда слишком много файлов для удаления, я получаю сообщение об ошибке, говорящее, что я превысил максимальную скорость записи. Это потому, что команда set trashed содержится в цикле for. Если я добавлю режим сна, чтобы замедлить цикл, я получу еще одну ошибку, сообщающую, что сценарий не завершился в указанное время.

Я мог бы просто запустить его 2 или 3 раза, но это неуклюже.

Как я могу изменить этот сценарий, чтобы он создавал временный список файлов, которые нужно удалить, и когда он, наконец, выйдет из цикла, выполните удаление? У меня нет большого опыта работы с языком и синтаксисом GAS, так что подробности были бы действительно потрясающими.

4 ответа

Решение

Этот код вернет все идентификаторы файлов старше 30 дней. Он сильно отличается от кода, на который ссылается другой пост. Код, который вы используете, содержит устаревший класс. DocsList устарел. Код, который я вам даю, использует DriveApp и использует searchFiles() метод.

Документация Google - Поиск файлов

GS Script

function getFilesByDate() {
  var arrayOfFileIDs = [];

  var ThirtyDaysBeforeNow = new Date().getTime()-3600*1000*24*30;
    // 30 is the number of days 
    //(3600 seconds = 1 hour, 1000 milliseconds = 1 second, 24 hours = 1 day and 30 days is the duration you wanted
    //needed in yr-month-day format

  var cutOffDate = new Date(ThirtyDaysBeforeNow);
  var cutOffDateAsString = Utilities.formatDate(cutOffDate, "GMT", "yyyy-MM-dd");
  //Logger.log(cutOffDateAsString);

  var theFileID = "";

  //Create an array of file ID's by date criteria
  var files = DriveApp.searchFiles(
     'modifiedDate < "' + cutOffDateAsString + '"');

  while (files.hasNext()) {
    var file = files.next();
    theFileID = file.getId();

    arrayOfFileIDs.push(theFileID);
    //Logger.log('theFileID: ' + theFileID);
    //Logger.log('date last updated: ' + file.getLastUpdated());
  }

  return arrayOfFileIDs;
  //Logger.log('arrayOfFileIDs: ' + arrayOfFileIDs);
};

Вы можете откомментировать Logger.log() операторы, запустите код и посмотрите, что код возвращает, если хотите. Есть один Logger.log() заявление:

//Logger.log('date last updated: ' + file.getLastUpdated());

Это напечатает даты файлов, которые были получены. Так что вы можете посмотреть на это, прежде чем удалять какие-либо файлы.

Этот код не удаляет файлы и не устанавливает ничего в корзину. Он просто ищет файлы по дате и создает массив всех идентификаторов файлов.

Таким образом, функция удаления или удаления файлов может сначала вызвать эту функцию и получить список всех идентификаторов файлов для работы.

Если вы хотите удалить свои файлы без предварительной установки их в корзину, это можно сделать.

Вам необходимо явно включить расширенные службы Google в своем проекте скрипта приложений и в консоли разработчика. Если вы не сделаете оба, это не сработает.

//This requires the Drive API To be turned on in the Advanced Google Services
//Under the RESOURCES menu, choose ADVANCED GOOGLE SERVICES
function deleteFile(idToDLET) {
  idToDLET = 'the File ID';

  //This deletes a file without needing to move it to the trash
  var rtrnFromDLET = Drive.Files.remove(idToDLET);
}

Чтобы вызвать функцию, которая получает идентификаторы файлов для удаления, это будет выглядеть так:

ПРЕДУПРЕЖДЕНИЕ! ЭТО УДАЛЯЕТ ФАЙЛЫ, БЕЗ ОТПРАВКИ ИХ В МУСОР! **** УБЕДИТЕСЬ, ЧТО ВЫ ЗНАЕТЕ, ЧТО УДАЛЯЕТСЯ!

function deleteFiles() {
  var arrayIDs = getFilesByDate();

  for (var i=0; i < arrayIDs.length; i++) {
    Logger.log('arrayIDs[i]: ' + arrayIDs[i]);
    //This deletes a file without needing to move it to the trash
    var rtrnFromDLET = Drive.Files.remove(arrayIDs[i]);
  }
};

Используя решение, опубликованное Сэнди выше, я изменил его, чтобы он был специфичен для конкретной папки.

function getOldFileIDs() {
  var fileIDs = [];
  // Old date is 30 days
  var oldDate = new Date().getTime() - 3600*1000*24*30;
  var cutOffDate = Utilities.formatDate(new Date(oldDate), "GMT", "yyyy-MM-dd");

  // Get folderID using the URL on google drive
  var folder = DriveApp.getFolderById('XXXXXXX');
  var files = folder.searchFiles('modifiedDate < "' + cutOffDate + '"');

  while (files.hasNext()) {
    var file = files.next();
    fileIDs.push(file.getId());
    Logger.log('ID: ' + file.getId() + ', Name: ' + file.getName());
  }
  return fileIDs;
};

function deleteFiles() {
  var fileIDs = getOldFileIDs();
  fileIDs.forEach(function(fileID) {
    DriveApp.getFileById(fileID).setTrashed(true);
  });
};

Я придумал другое решение. Это работает только в том случае, если файлы вашего Google Диска синхронизируются с вашим жестким диском.

Если ваши файлы Google Диска синхронизируются с вашим жестким диском, то, если вы удалите их в локальной папке жесткого диска, они также будут удалены с Google Диска. Таким образом, миссия заключается в том, чтобы автоматически удалять файлы, возраст которых превышает X дней, из ваших папок Google.

Это скрипт Windows Powershell, который позволит вам сделать это: https://gallery.technet.microsoft.com/scriptcenter/Delete-files-older-than-x-13b29c09

Запуск сценария с этой конфигурацией:

powershell -file c:\users\owner\documents\windows\deleteold\deleteold.ps1 -FolderPath "C:\Users\owner\Google Drive\iSpy\video\Bedroom" -FileAge 30 -logfile c:\users\owner\documents\windows\deleteold\logs\Bedroom.log -CreateTime -NoFolder

Я могу удалить все файлы iSpy старше 30 дней из моей синхронизированной папки "Спальня" на Google Диске.

Следуя этим инструкциям:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx

Я могу запустить скрипт автоматически с помощью планировщика заданий Windows.

Задача решена.

когда я попытался запустить приведенный ниже скрипт

      function getOldFileIDs() {
  var fileIDs = [];
  // Old date is 30 days
  var oldDate = new Date().getTime() - 3600*1000*24*30;
  var cutOffDate = Utilities.formatDate(new Date(oldDate), "GMT", "yyyy-MM-dd");

  // Get folderID using the URL on google drive
  var folder = DriveApp.getFolderById('XXXXXXX');
  var files = folder.searchFiles('modifiedDate < "' + cutOffDate + '"');

  while (files.hasNext()) {
    var file = files.next();
    fileIDs.push(file.getId());
    Logger.log('ID: ' + file.getId() + ', Name: ' + file.getName());
  }
  return fileIDs;
};

function deleteFiles() {
  var fileIDs = getOldFileIDs();
  fileIDs.forEach(function(fileID) {
    DriveApp.getFileById(fileID).setTrashed(true);
  });
};

журнал выполнения отображается, как показано ниже, и файлы не удаляются.

      9:55:19 PM  Notice  Execution started
9:55:20 PM  Notice  Execution completed
Другие вопросы по тегам