Приложения Google script: как удалить файл на Google Диске?
Как написать скрипт Google Apps, который удаляет файлы?
Это находит файлы:
var ExistingFiles = DocsList.find(fileName);
Но DocsList.deleteFile
не существует для удаления файла.
Есть ли способ переместить эти файлы в другую папку или в корзину?
Другой обходной путь, который я хотел бы рассмотреть, - это возможность переопределить существующий файл с тем же именем.
В настоящее время, когда я хочу создать файл с именем, уже используемым в MyDrive, он создает второй файл с тем же именем. Я хотел бы сохранить 1 файл (новый сохраняется, а старый теряется).
Ответы
Ответ 1
Служба DocsList
устарела. Этот ответ использует более DriveApp
службу DriveApp
.
Есть способ удалить файл, не отправляя его в корзину. Возможно, вы захотите удалить файл, не отправляя его в корзину, чтобы впоследствии не очистить папку корзины. У расширенной службы накопителей есть метод remove
который удаляет файл, не отправляя его в корзину. Расширенные сервисы имеют те же возможности, что и API, без необходимости запрашивать HTTPS GET или POST.
function delteFile(myFileName) {
var allFiles, idToDLET, myFolder, rtrnFromDLET, thisFile;
myFolder = DriveApp.getFolderById('Put_The_Folder_ID_Here');
allFiles = myFolder.getFilesByName(myFileName);
while (allFiles.hasNext()) {//If there is another element in the iterator
thisFile = allFiles.next();
idToDLET = thisFile.getId();
//Logger.log('idToDLET: ' + idToDLET);
rtrnFromDLET = Drive.Files.remove(idToDLET);
};
};
Это объединяет сервис DriveApp и Drive API для удаления файла без отправки его в корзину. Для метода Drive API .remove(id)
требуется идентификатор файла. Если идентификатор файла недоступен, но имя файла есть, тогда файл можно сначала найти по имени, а затем получить идентификатор файла.
Чтобы использовать DriveAPI, необходимо добавить его через меню " Ресурсы", " Расширенные службы Google". Установите для Drive API значение ON. И убедитесь, что Drive API включен в вашей консоли разработчиков Google. Если он не включен в обоих местах, он не будет доступен.
Ответ 2
В этом коде используется класс DocsList
, который теперь устарел.
попробуйте следующее:
function test(){
deleteDocByName('Name-of-the-file-to-delete')
}
function deleteDocByName(fileName){
var docs=DocsList.find(fileName)
for(n=0;n<docs.length;++n){
if(docs[n].getName() == fileName){
var ID = docs[n].getId()
DocsList.getFileById(ID).setTrashed(true)
}
}
}
так как у вас может быть много документов с тем же именем, я использовал цикл for для получения всех документов в массиве документов и при необходимости удалял их один за другим.
Я использовал функцию с именем файла как параметром, чтобы упростить его использование в script, использовать тестовую функцию, чтобы попробовать.
Примечание: помните, что все файлы с таким именем будут уничтожены (и восстановлены; -)
О последней части вашего вопроса о сохранении самого последнего и удалении старого, это было бы выполнимо (читая последнюю доступную дату и время), но я думаю, что это лучшая идея для удаления старого файла перед созданием нового с тем же именем... гораздо более логичным и безопасным!
Ответ 3
Теперь вы можете использовать следующее, если файл является таблицей, doc и т.д.:
DriveApp.getFileById(spreadsheet.getId()).setTrashed(true);
или если у вас уже есть файл вместо электронной таблицы, doc и т.д., вы можете использовать:
file.setTrashed(true);
Ответ 4
Несмотря на то, что служба DocsList теперь устарела, как и из ссылок в папке класса, метод setvashed остается в силе:
https://developers.google.com/apps-script/reference/drive/folder#settrashedtrashed
Таким образом, нужно просто выполнить это:
ExistingFiles.settrashed(true);
Ответ 5
Вот еще один способ сделать это без необходимости Drive API. (на основе ответа Аллана).
function deleteFile(fileName, folderName) {
var myFolder, allFiles, file;
myFolder = DriveApp.getFoldersByName(folderName).next();
allFiles = myFolder.getFilesByName(fileName);
while (allFiles.hasNext()) {
file = allFiles.next();
file.getParents().next().removeFile(file);
}
}