【问题标题】:Adding Replace Existing File to GmailToDrive App Script将替换现有文件添加到 GmailToDrive 应用脚本
【发布时间】:2019-03-15 06:14:52
【问题描述】:

我正在寻找这个应用程序脚本来替换谷歌驱动器中的现有文件,而不是在它识别出驱动器中已经存在文件时写入它们的副本。我已经尝试了一些东西,但我无法让它按预期工作。

它要求我添加其他信息,但我的问题不需要更多上下文。我将其添加为填充物。

  // 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;
}

【问题讨论】:

  • 欢迎来到 StackOverFlow,请借此机会使用tour 并学习如何使用How to Ask 并提供minimal reproducible example。如果您收到可以帮助您解决问题的答案,请将其选中,以便每个人都可以看到问题已解决。通常,我们希望看到您有问题的代码以及您尝试过的内容的描述。如果您成功地将所有这些建议整合到您的问题中,那么您更有可能快速解决您的问题。

标签: google-apps-script google-sheets


【解决方案1】:
  • 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 的 delete 方法。
完全删除文件的脚本:
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同名的现有文件中,可以使用以下脚本。

当您使用此脚本时,请在高级 Google 服务和 API 控制台中启用 Drive API。你可以在here 看到这个。

修改后的脚本:

从:
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
}

注意:

  • 运行此脚本时,现有文件将被覆盖。所以首先,请注意这一点。所以我建议它使用一个虚拟文件来测试这个脚本。

参考:

【讨论】:

  • 这几乎是我想要的,但我希望文件被覆盖而不是被删除,以便它的共享链接中的 UUID 保持不变,这可能吗?
  • @Chris Hart 对于给您带来的不便,我深表歉意。我曾认为从您的脚本中,您想创建 attachmentBlob 作为新文件。我可以理解你想要做什么如下。您想将attachmentBlob 覆盖到与attachmentBlob 文件名相同的现有文件。通过这个,我更新了我的答案。你能确认一下吗? 当您运行此脚本时,现有文件将被覆盖。所以首先,请注意这一点。所以我建议它使用一个虚拟文件来测试这个脚本。
  • 我已经更新了这个脚本,但现在它只是标记了电子邮件,并没有将任何内容下载到文件中。
  • @Chris Hart 感谢您的回复。我带来的不便表示歉意。当文件不重复时,我忘记添加 create 方法。我更新了我的答案。你能确认一下吗?通过此更新,当附件文件不重复时,将创建新文件。并且当附件文件被复制时,文件被覆盖到现有文件中。
猜你喜欢
  • 2020-03-07
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2014-05-13
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多