【问题标题】:Checking a folder for a filename, and exporting as PDF if it is not found检查文件夹中的文件名,如果找不到则导出为 PDF
【发布时间】:2018-05-29 21:03:36
【问题描述】:

我对脚本很陌生,并且已经尝试了很多小时,所以我希望你能帮助我。

我有一个包含名为“X”的 Google 表格的 dashfolder,我有一个包含名为“X.pdf”的 pdf 的 pdf 文件夹。我正在尝试遍历我的 dashfiles +“.pdf”的名称以查找丢失的名称,最后在同一文件夹中创建其 pdf。但是,我的脚本循环了太多次。如果 pdf 文件夹中已经有一个名为+“.pdf”的文件,我希望它跳过 dashfile。这是我的代码

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 分钟的限制。因此,我正在尝试构建一个脚本,该脚本可以自行触发并从中断处继续,跳过 pdf 文件夹中已经存在的工作表并创建缺少的工作表。

我在这里可能有点过头了,所以我希望有人能给我一些提示:-)

【问题讨论】:

  • 拆分你的任务 - 编写一个函数来处理将给定文件名导出到 PDF,编写一个存储文件名列表的函数,编写一个读取该文件名列表的函数,编写一个生成给定文件夹中的文件列表,编写一个函数返回列表 A 中不在列表 B 中的元素,然后编写一个使用上述所有内容的函数。

标签: google-apps-script google-drive-api export-to-pdf


【解决方案1】:

你错误地使用了循环。目前,您创建更多同一张表的 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");
  }
}

【讨论】:

  • 感谢您的回答!我分配了我的任务,并根据您的建议完成了所有工作。
【解决方案2】:

您可以创建一个值为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");
  }

}

【讨论】:

  • Array#indexOf 肯定比数组上的完整 for 循环更简洁,但我认为它不会更快,因为它仍然是所有字符串相等性测试。 IMO 最好的解决方案是散列对象中的文件名。
  • 将文件名散列成什么? key:"file_Name" key 会是什么?
  • 使用文件名作为键 :) 值可以是无聊的 (true) 或有用的(如文件的 id 等)
  • 在此处查看我的答案:stackoverflow.com/a/50286994/9337071 以了解我存储有用信息的情况
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多