Google apps script 按名称覆盖文件夹中的现有文件(第2部分)

Google apps script 按名称覆盖文件夹中的现有文件(第2部分),google-apps-script,Google Apps Script,以这种方式测试脚本时,如果SQUADS文件夹中没有具有我要保存的名称的文件,它实际上会保存在SQUADS文件夹中 但是,当有一个名为我想要的文件时,它会将新的PDF保存在Google Drive主文件夹中,正确的做法是删除SQUADS文件夹中的现有文件,并保存在SQUADS文件夹中 有些东西不见了,我仍然不明白如何解决 var token = ScriptApp.getOAuthToken(); var docurl = UrlFetchApp.fetch(theurl, { h

以这种方式测试脚本时,如果
SQUADS
文件夹中没有具有我要保存的名称的文件,它实际上会保存在SQUADS文件夹中

但是,当有一个名为我想要的文件时,它会将新的PDF保存在Google Drive主文件夹中,正确的做法是删除
SQUADS
文件夹中的现有文件,并保存在
SQUADS
文件夹中

有些东西不见了,我仍然不明白如何解决

    var token = ScriptApp.getOAuthToken();
    var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' +  token } });
    var pdfBlob = docurl.getBlob();

    // Get filename from sheet "Work", cell "B5"
    var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();

    // Create file from blob and name it
    // The newFile is placed in the root folder by default
    var newFile = DriveApp.createFile(pdfBlob).setName(fileName);  

    // if folder exists use next 
    if (DriveApp.getFoldersByName("Squads").hasNext()){
      var folder = DriveApp.getFoldersByName("Squads").next();

      // if folder does not exist
    } else {
      var folder = DriveApp.createFolder("Squads");// new folder created in the root folder by default
    }

    //prepare new file and Squads folder;

    var existing = folder.getFilesByName(fileName); //returns file iterator;
    var hasFile = existing.hasNext(); //check if iterator isn't empty;
    if(hasFile) {
      var duplicate = existing.next(); //access file;

      //delete file;
      var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
      var dres = UrlFetchApp.fetch(durl,'delete',{
        muteHttpExceptions: true,
        headers: {'Authorization': 'Bearer '+token}
      });
      if(dres.getResponseCode()>=400) {
        //handle errors;
      }
    }

    //continue: add file, remove from root, etc;

    folder.addFile(newFile); // add new file to folder
    DriveApp.removeFile(newFile); // remove file from root folder

在资源方面似乎已经授权→ 谷歌高级服务→ 驱动API V2问题

删除重复文件并在目标文件夹中创建新文件

解决方案

要展开第1部分和注释,可以在目标文件夹上使用
createFile()
方法,以确保新文件直接在其中创建,而不是在驱动器的根目录中创建。脚本的修改结果应如下所示:

此示例假定您在激活高级服务时将其命名为“驱动API”。还要注意的是,
文件夹
声明被移动到函数作用域以正常工作(如果要在较宽的范围内使用变量,请不要在较小的范围内声明变量[在
if…else
语句中]):

高级驱动器服务解决方案

驱动API解决方案

参考

  • createFile()
    来自Blob[
    文件夹
    class]
  • 驱动器
    高级服务
  • 文件
    资源[驱动公共API]
  • (参见参数处理)
    Frederico,您可以在
    hasFile
    检查后,使用文件夹本身的方法直接在文件夹中创建文件(您必须将
    Blob
    转换为字符串,因为该方法接受内容字符串),小提示上次我忘了-不要重新定义变量,例如
    文件夹
    :将其声明移动到函数级别,有条件地设置它,然后进行
    hasFile
    检查,然后创建文件另一个提示是,如果您使用的是高级服务,则不需要调用公共API,访问
    duplicate
    文件后,您可以通过
    {service name what you set}.Files.remove(duplicate.getId())
    调用它。虽然我不确定这是否是您想要的方向,但如果您想在不更改文件ID的情况下替换PDF文件,您也可以使用的方法。谢谢您的回复。我可以理解您想要更改文件ID以替换文件。在这种情况下,需要完全删除现有文件并创建新文件。顺便说一下,我认为
    var dres=UrlFetchApp.fetch(durl,'delete',{muteHttpExceptions:true,headers:{'Authorization':'Bearer'+token}})的脚本可能会出错。这个怎么样?@Frederico Mattos,@Tanaike-my bad,yes(正如我对第1部分的回答中的fetch部分),它应该是:`UrlFetchApp.fetch(durl,{method:'delete',headers:{'Authorization':'Bearer'+token},muteHttpExceptions:true});非常感谢您的耐心和花时间来澄清我的剩余问题。系统非常完美,甚至比以前更快,非常感谢@弗雷德里克马托斯-没问题,很乐意帮忙!干得好@OlegValter!您也可以查看谷歌批处理API以获得更高的效率。@contributorpw-谢谢!同意,稍后将进一步扩展(批处理操作不在操作的问题范围内,但既然我们在这里:)
    
    //...get token and Blob (do not create the file);
    
    var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();
    
    //Access or create the 'Squads' folder;
    var folder; //declare folder;
    var folders = DriveApp.getFoldersByName("Squads"); //returns iterator;
    if(folders.hasNext()) {
      folder = folders.next();
    }else {
      folder = DriveApp.createFolder("Squads");
    }
    
    //Remove duplicate file with the same name;
    var existing = folder.getFilesByName(fileName); //returns iterator;
    if(existing.hasNext()) {
      var duplicate = existing.next();
    
      //use either Drive API or Advanced service solution here;
    }
    
    //add file;
    folder.createFile(pdfBlob).setName(fileName);
    
    DriveAPI.Files.remove(duplicate.getId());
    
    var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
    var dres = UrlFetchApp.fetch(durl,{
      method: 'delete',
      muteHttpExceptions: true,
      headers: {'Authorization': 'Bearer '+token}
    });
    if(dres.getResponseCode()>=400) {
      //handle errors;
    }