Добавление замены существующего файла в скрипт приложения GmailToDrive - PullRequest
0 голосов
/ 12 марта 2019

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

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

  // GLOBALS
//Array of file extension which you would like to extract to Drive
var fileTypesToExtract = ['csv'];
//Name of the folder in google drive i which files will be put
var folderName = 'GmailToDrive';
//Name of the label which will be applied after processing the mail message
var labelName = 'GmailToDrive';



function GmailToDrive(){
  //build query to search emails
  var query = '';
  //filename:jpg OR filename:tif OR filename:gif OR fileName:png OR filename:bmp OR filename:svg'; //'after:'+formattedDate+
  for(var i in fileTypesToExtract){
 query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
  }
  query = 'in:inbox has:nouserlabels ' + query;
  var threads = GmailApp.search(query);
  var label = getGmailLabel_(labelName);
  var parentFolder;
  if(threads.length > 0){
    parentFolder = getFolder_(folderName);
  }
  var root = DriveApp.getRootFolder();
  for(var i in threads){
    var mesgs = threads[i].getMessages();
 for(var j in mesgs){
      //get attachments
      var attachments = mesgs[j].getAttachments();
      for(var k in attachments){
        var attachment = attachments[k];
        var isDefinedType = checkIfDefinedType_(attachment);
     if(!isDefinedType) continue;
     var attachmentBlob = attachment.copyBlob();
        var file = DriveApp.createFile(attachmentBlob);
        parentFolder.addFile(file);
        root.removeFile(file);
      }
 }
 threads[i].addLabel(label);
  }
}

//This function will get the parent folder in Google drive
function getFolder_(folderName){
  var folder;
  var fi = DriveApp.getFoldersByName(folderName);
  if(fi.hasNext()){
    folder = fi.next();
  }
  else{
    folder = DriveApp.createFolder(folderName);
  }
  return folder;
}

//getDate n days back
// n must be integer
function getDateNDaysBack_(n){
  n = parseInt(n);
  var date = new Date();
  date.setDate(date.getDate() - n);
  return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd');
}

function getGmailLabel_(name){
  var label = GmailApp.getUserLabelByName(name);
  if(!label){
 label = GmailApp.createLabel(name);
  }
  return label;
}

//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
  else return false;
}

1 Ответ

0 голосов
/ 13 марта 2019
  • Когда файл создается с помощью var file = DriveApp.createFile(attachmentBlob), если существует то же имя файла с attachmentBlob, вы хотите заменить существующий файл новым файлом, созданным с attachmentBlob.

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

  1. Извлечение имени файла attachment.
  2. Если существует файл с тем же именем, что и извлеченное имя файла, существующеефайл удален.
  3. Создайте новый файл с attachment.

Модифицированный скрипт:

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

От:
var attachmentBlob = attachment.copyBlob();
var file = DriveApp.createFile(attachmentBlob);
parentFolder.addFile(file);
root.removeFile(file);
До:
var attachmentBlob = attachment.copyBlob();
var existingFile = DriveApp.getFilesByName(attachment.getName());
if (existingFile.hasNext()) {
  var file = existingFile.next();
  file.setTrashed(true);
}
var file = DriveApp.createFile(attachmentBlob);
parentFolder.addFile(file);
root.removeFile(file);

Примечание:

  • Этот модифицированный скрипт предполагает, что на вашем диске есть только один дублированный файл,Если есть несколько файлов с одним и тем же именем, скажите мне.
  • file.setTrashed(true) просто помещает файл в корзину.Если вы хотите полностью удалить файл, замените file.setTrashed(true); на следующий скрипт.Следующий скрипт использовал метод удаления Drive API.
Скрипт для полного удаления файла:
var url = "https://www.googleapis.com/drive/v3/files/" + file.getId();
var params = {
  method: "delete",
  headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}
}
UrlFetchApp.fetch(url, params);

Ссылки:

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

Редактировать:

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

Когда вы используете этот скрипт, пожалуйста, включите Drive API в Advanced Google Services и консоли API.Об этом вы можете узнать по здесь .

Модифицированный скрипт:

От:
var attachmentBlob = attachment.copyBlob();
var file = DriveApp.createFile(attachmentBlob);
parentFolder.addFile(file);
root.removeFile(file);
До:
var attachmentBlob = attachment.copyBlob();
var existingFile = DriveApp.getFilesByName(attachment.getName());
if (existingFile.hasNext()) {
  var file = existingFile.next();
  Drive.Files.update({}, file.getId(), attachmentBlob);
} else { // Added
  var file = DriveApp.createFile(attachmentBlob); // Added
  parentFolder.addFile(file); // Added
  root.removeFile(file); // Added
}

Примечание:

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

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...