Google apps script 检查文件夹中的文件名,如果找不到,则导出为PDF

Google apps script 检查文件夹中的文件名,如果找不到,则导出为PDF,google-apps-script,google-drive-api,export-to-pdf,Google Apps Script,Google Drive Api,Export To Pdf,我对脚本编写非常陌生,现在已经尝试了很多小时了,所以我希望你能帮助我 我有一个dashfolder,其中包含名为“X”的谷歌表单,还有一个pdf文件夹,其中包含名为“X.pdf”的pdf文件。我正在尝试循环查找dashfiles+“.pdf”的名称,以查找缺少的名称,并最终在同一文件夹中创建其pdf。但是,我的脚本循环次数太多。如果pdf文件夹中已存在名为“+”.pdf”的文件,我希望它跳过dashfile。这是我的密码 function createPdf() { var pdfFolde

我对脚本编写非常陌生,现在已经尝试了很多小时了,所以我希望你能帮助我

我有一个dashfolder,其中包含名为“X”的谷歌表单,还有一个pdf文件夹,其中包含名为“X.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分钟的限制。因此,我正在尝试构建一个脚本,该脚本可以触发自身并继续它停止的地方,跳过pdffolder中已经存在的工作表,创建缺少的工作表


这里我可能有点不知所措,所以我希望有人能给我一些提示:-)

您可以创建一个文件名对象,其值为
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
代码: 原始答复:

以不同的方式测试pdf数组中是否存在文件名

pdfNames.indexOf(fileName + ".pdf") !== -1
如果在数组中找不到值,则
indexOf()
返回负一。 因此,如果返回值不是负1,则会找到一个文件名。如果找到文件名,则不希望创建新文件,请继续

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");
  }

}

您可以创建一个值为
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
代码: 原始答复:

以不同的方式测试pdf数组中是否存在文件名

pdfNames.indexOf(fileName + ".pdf") !== -1
如果在数组中找不到值,则
indexOf()
返回负一。 因此,如果返回值不是负1,则会找到一个文件名。如果找到文件名,则不希望创建新文件,请继续

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");
  }

}

你用错了循环。当前,您为同一张图纸创建了更多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");
  }
}

你用错了循环。当前,您为同一张图纸创建了更多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");
  }
}

拆分任务-编写一个函数,用于将给定文件名导出为PDF,编写一个函数,用于存储文件名列表,编写一个函数,用于读取文件名列表,编写一个函数,用于生成给定文件夹中的文件列表,编写一个函数,用于返回列表a中不在列表B中的元素,然后编写一个使用上述所有功能的函数。拆分任务-编写一个处理将给定文件名导出为PDF的函数,编写一个存储文件名列表的函数,编写一个读取该文件名列表的函数,编写一个生成给定文件夹中文件列表的函数,编写一个函数,返回列表B以外的列表a的元素,然后编写一个函数,使用上述所有元素。数组#indexOf肯定比数组上的完整
for
循环更简洁,但我认为它不会更快,因为它仍然是字符串平等测试。在我看来,最好的解决方案是对对象中的文件名进行散列。将文件名散列为什么<代码>键:“文件名”键将是什么?使用文件名作为键:)值可能很无聊(
true
)或有用(如文件的id等)。请参见我的答案:对于存储有用信息的情况,数组#indexOf肯定比数组上完整的
for
循环更简洁,但我不认为它会更快,因为它仍然是字符串平等性测试。在我看来,最好的解决方案是对对象中的文件名进行散列。将文件名散列为什么<代码>键:“文件名”键将是什么?使用文件名作为键:)该值可能很无聊(
true
)或有用(如文件的id等)。请参阅我的答案:有关我存储有用信息的情况,谢谢您的回答!我完成了我的任务,并根据你的建议完成了所有工作。谢谢你的回答!我把我的任务分了出去,按照你的建议做了一切。