Добавить код для перезаписи PDF, если файл с таким именем уже существует в папке Google Диска - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть этот скрипт для сохранения моей электронной таблицы в папке Google Drive Squads.

Имя сохраненного файла соответствует значению в ячейке H2 из Geraisстраница, иногда имя повторяется, и при сохранении вместо подписки на существующий создается новый файл, я хотел бы добавить в этот код параметр, что если файл с таким же именем, как этот новый, уже существует, а неимея два файла с одинаковым именем в папке 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

Я попытался создать взаимодействие между IF и ELSE тоже, чтобы имя файла совпадало с именем папки, но мне не удалось набрать

1 Ответ

1 голос
/ 28 сентября 2019

Проблема

Перезапись существующего File в Folder его именем (предположительно уникальное).

Решение

Как насчет проверки, существует ли файл с именем, записанным в переменную fileName, и, если да, удалить его перед добавлением вновь созданного? Модификация будет выглядеть примерно так (ваш сценарий авторизован с одной областью, необходимой для 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. То, как вы определяете параметры запроса, является общим случаем пирамиды гибели .Кроме того, каждый параметр жестко задан, что делает экспорт негибким.Чтобы избежать этого, используйте объекты для их настройки (поскольку запрос - это не более чем набор пар ключ-значение):

    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('&');
    

Updates

Исправленный UrlFetchApp.fetch() вызов как method должен быть свойством объекта параметров, а не аргументом.

Ссылка

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