Проверка папки на имя файла и экспорт в PDF, если он не найден - PullRequest
0 голосов
/ 30 мая 2018

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

У меня есть папка с таблицами Google, которая называется "X", и у меня естьpdffolder, содержащий файлы pdf, которые называются «X.pdf».Я пытаюсь перебрать имена моих dashfiles + ".pdf", чтобы найти те, которые отсутствуют, и, наконец, создать свой pdf в той же папке.Мой сценарий, однако, зацикливается слишком много раз.Я хочу пропустить dashfile, если файл с именем + .pdf уже находится в pdffolder.Вот мой код

function createPdf() {
  var pdfFolder = DriveApp.getFolderById("ID")
  var pdfFiles = pdfFolder.getFiles();
  var dashFolder = DriveApp.getFolderById('ID');
  var dashFiles = dashFolder.getFiles();
  var pdfNames = [];
  var dashNames = [];

  while (pdfFiles.hasNext()) {
     var currentFile2 = pdfFiles.next();
     var fileName2 = currentFile2.getName();
     pdfNames.push(fileName2);
  }

  while (dashFiles.hasNext()) {
    var currentFile = dashFiles.next();
    var fileName = currentFile.getName();
    dashNames.push(fileName);

    for (p in pdfNames) {
      if((fileName + ".pdf") == pdfNames[p]) {
        Logger.log("YES");
      }
      else {
        var xlsBlob = currentFile.getBlob(); // Blob source of Excel file for conversion
        var xlsFilename = currentFile.getName(); // File name to give to converted file; defaults to same as source file
        pdfFolder.createFile(currentFile.getAs(MimeType.PDF));
        Logger.log("pdf Created");
      }
    }
  }
}

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

Я мог бы оказаться здесь над головой, поэтомуЯ надеюсь, что кто-то может дать мне несколько советов: -)

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы неправильно используете петли.В настоящее время вы создаете больше PDF-файлов на том же листе, потому что при обходе dashFiles вы создаете еще один PDF-файл для каждого существующего PDF-файла.

Изменить часть кода следующим образом:

var pdfNames = {}; //Object instead of array

while (pdfFiles.hasNext()) {
   var currentFile2 = pdfFiles.next();
   var fileName2 = currentFile2.getName();
   pdfNames[fileName2] = true; // use PDF name as key for faster searching
}

while (dashFiles.hasNext()) {
  var currentFile = dashFiles.next();
  var fileName = currentFile.getName();

  if(pdfNames[fileName + ".pdf"]) { // is exists pdf?
    Logger.log("YES");
  }
  else {
    var xlsBlob = currentFile.getBlob(); // Blob source of Excel file for conversion
    var xlsFilename = currentFile.getName(); // File name to give to converted file; defaults to same as source file
    pdfFolder.createFile(currentFile.getAs(MimeType.PDF));
    Logger.log("pdf Created");
  }
}
0 голосов
/ 30 мая 2018

Вы можете создать объект с именами файлов со значением true, а затем проверить наличие имени файла в объекте.Если имя файла существует, продолжайте цикл.

var pdfNames = {};//Create an object - not an array
pdfNames[fileName2] = true;//Put the file name into the object
if (pdfNames[fileName]) {//Test for file name in the object

Код:

function createPdf() {
  var currentFile,fileName,xlsBlob,xlsFilename;
  var pdfFolder = DriveApp.getFolderById("ID")
  var pdfFiles = pdfFolder.getFiles();
  var dashFolder = DriveApp.getFolderById('ID');
  var dashFiles = dashFolder.getFiles();
  var pdfNames = {};
  var dashNames = [];

  while (pdfFiles.hasNext()) {
     var currentFile2 = pdfFiles.next();
     var fileName2 = currentFile2.getName();
     pdfNames[fileName2] = true;//Put the file name into the object
  }

  while (dashFiles.hasNext()) {
    currentFile = dashFiles.next();
    fileName = currentFile.getName();
    dashNames.push(fileName);

    if (pdfNames[fileName]) {//The file name was found in the object of pdf files
      Logger.log("YES");
      continue;
    }

    xlsBlob = currentFile.getBlob(); // Blob source of Excel file for conversion
    xlsFilename = currentFile.getName(); // File name to give to converted file; defaults to same as source file
    pdfFolder.createFile(currentFile.getAs(MimeType.PDF));
    Logger.log("pdf Created");
  }

}

Оригинальный ответ:

Проверка на наличие имени файла вМассив pdf другим способом.

pdfNames.indexOf(fileName + ".pdf") !== -1

Если значение не найдено в массиве, то indexOf() возвращает минус единицу.Итак, если возвращаемое значение не минус один, то имя файла найдено.Если имя файла найдено, вы не хотите создавать новый файл, поэтому продолжайте.

function createPdf() {
  var currentFile,fileName,xlsBlob,xlsFilename;
  var pdfFolder = DriveApp.getFolderById("ID")
  var pdfFiles = pdfFolder.getFiles();
  var dashFolder = DriveApp.getFolderById('ID');
  var dashFiles = dashFolder.getFiles();
  var pdfNames = [];
  var dashNames = [];

  while (pdfFiles.hasNext()) {
     var currentFile2 = pdfFiles.next();
     var fileName2 = currentFile2.getName();
     pdfNames.push(fileName2);
  }

  while (dashFiles.hasNext()) {
    currentFile = dashFiles.next();
    fileName = currentFile.getName();
    dashNames.push(fileName);

    if (pdfNames.indexOf(fileName + ".pdf") !== -1) {//The file name was found in the array of pdf files
      Logger.log("YES");
      continue;
    }

    xlsBlob = currentFile.getBlob(); // Blob source of Excel file for conversion
    xlsFilename = currentFile.getName(); // File name to give to converted file; defaults to same as source file
    pdfFolder.createFile(currentFile.getAs(MimeType.PDF));
    Logger.log("pdf Created");
  }

}
...