Проверка папки на предмет имени файла и экспорт в PDF, если он не найден

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

У меня есть папка с таблицами Google под названием «X», и у меня есть папка pdffolder, содержащая файлы PDF, которые называются «X.pdf». Я пытаюсь перебрать имена моих даш-файлов + «.pdf», чтобы найти те, которые отсутствуют, и, наконец, создать свой pdf-файл в той же папке. Однако мой сценарий повторяется слишком много раз. Я хочу, чтобы он пропустил даш-файл, если файл с именем + ". 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, и создавая те, которые отсутствуют.

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


person Jacob Heath    schedule 29.05.2018    source источник
comment
разделите свою задачу - напишите функцию, которая обрабатывает экспорт заданного имени файла в PDF, напишите функцию, которая хранит список имен файлов, напишите функцию, которая читает этот список имен файлов, напишите функцию, которая генерирует список файлов в данной папке, напишите функцию, которая возвращает элементы списка A, которых нет в списке B, а затем напишите функцию, которая использует все вышеперечисленное.   -  person tehhowch    schedule 30.05.2018


Ответы (2)


Вы неправильно используете петли. В настоящее время вы создаете больше PDF-файлов одного и того же листа, потому что, проходя через dashFiles, вы создаете PDF-файл, еще один 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");
  }
}
person JakubBoucek    schedule 29.05.2018
comment
Спасибо за ответ! Я распределил свои задачи, и все заработало, исходя из ваших рекомендаций. - person Jacob Heath; 15.06.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");
  }

}
person Alan Wells    schedule 29.05.2018
comment
Array # indexOf, безусловно, более краток, чем полный цикл for по массиву, но я не думаю, что он будет быстрее, потому что это все еще проверка на равенство строк. ИМО лучшее решение - хешировать имена файлов в объекте. - person tehhowch; 30.05.2018
comment
К чему хешировать имена файлов? key:"file_Name" Что будет key? - person Alan Wells; 30.05.2018
comment
Используйте имена файлов в качестве ключа :) значение может быть скучным (true) или полезным (например, идентификатор файла и т. Д.) - person tehhowch; 30.05.2018
comment
См. Мой ответ здесь: stackoverflow.com/a/50286994/9337071 для случая, когда я храню полезную информацию. - person tehhowch; 30.05.2018