【问题标题】:Append code to overwrite a PDF if a file of the same name already exists in the Google Drive folder如果 Google Drive 文件夹中已存在同名文件,请附加代码以覆盖 PDF
【发布时间】:2026-02-15 19:00:02
【问题描述】:

我有这个脚本可以将我的电子表格保存在 Google Drive Squads 文件夹中..

保存文件的名称是根据Gerais页面的单元格H2中的值,有时名称会重复,保存时会创建一个新文件而不是订阅现有文件,我想在这段代码中添加一个选项,如果一个与这个新文件同名的文件已经存在,而不是在 Google Drive Squads 文件夹中有两个同名文件,旧文件将完全消失,并且只有使新文件可用

    //Create PDF
    SpreadsheetApp.flush();

    var theurl = 'https://docs.google.com/a/mydomain.org/spreadsheets/d/' + // Best to place the line break after '+'
      'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' +  // SHEET ID
        '/export?format=pdf' +
          '&size=0' +
            '&portrait=true' +
              '&fitw=true' + 
                '&top_margin=0' +            
                  '&bottom_margin=0' +         
                    '&left_margin=0' +        
                      '&right_margin=0' +     
                        '&sheetnames=false&printtitle=false' +
                          '&pagenum=false' +
                            '&gridlines=false' +
                              '&fzr=FALSE' +
                                '&gid=' +
                                  'XXXXXXXXXXXX'; //SHEET PAGE ID

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

    // Get filename from sheet "Gerais", cell "H2"
    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
    }

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

我也尝试在 IFELSE 之间创建交互,以使文件名与我为文件夹名匹配的相同,但我尝试失败

【问题讨论】:

    标签: pdf google-apps-script google-sheets google-drive-api


    【解决方案1】:

    问题

    用名称覆盖Folder 中的现有File(可能是唯一的)。

    解决方案

    如何检查名称写入fileName 变量的文件是否存在,如果存在,在添加新创建的文件之前将其删除? 修改将如下所示(您的脚本已获得scopes required for the API 之一的授权):

    //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,{
        method: 'delete',
        muteHttpExceptions: true,
        headers: {'Authorization': 'Bearer '+token}
      });
      if(dres.getResponseCode()>=400) {
        //handle errors;
      }
    }
    
    //continue: add file, remove from root, etc;
    

    备注

    1. 您定义查询参数的方式是pyramid of doom 的常见情况。此外,每个参数都是硬编码的,这使得导出不灵活。为避免这种情况,请使用对象来配置它们(因为查询只不过是一组键值对):

      var params = {
        format: 'pdf',
        size: 0,
        portrait: true,
        fitw: true,
        top_margin: 0,        
        bottom_margin: 0,        
        left_margin: 0,    
        right_margin: 0,   
        sheetnames: false,
        printtitle: false,
        pagenum: false,
        gridlines: false,
        fzr: 'FALSE',
        gid: 'XXXXXXXXXXXX'
      };
      
      //append params to the url;
      var theurl = 'base?'+Object.keys(params).map(function(key){
        return key+'='+params[key];
      }).join('&');
      

    更新

    更正了 UrlFetchApp.fetch() 调用,因为 method 应该是参数对象属性而不是参数。

    参考

    1. 驱动API delete reference;

    【讨论】:

    • 小更新 - 添加了将参数附加到基本 url 的逻辑
    • 为了让我授权此范围界定交互,我可以通过 GAS 通过资源 → Google 高级服务 → Drive API V2 进行授权吗?它会是一个替代方案还是与它无关?你能帮我解决这个问题吗?谢谢
    • Frederico - 我认为您可以改用高级服务,是的,因为这只是公共 API 的谷歌应用脚​​本包装器(remove() 方法就足够了)
    最近更新 更多