在循环迭代时,Logger.log 重复打印相同的值

问题描述 投票:0回答:1

此 Google Apps 脚本可以正常工作,将文件夹中的多个 Google 文档保存为 PDF。但是,用于存储不同文件名的变量(当使用 Logger.log 打印时)似乎没有改变。文件夹中的一个文件(看似)是任意选择并一遍又一遍地打印的。

//https://github.com/Davor111/google-docs-to-pdf/blob/master/app.js

function gdocToPDF() {
  
  // Replace this ID
    var documentRootFolder = DriveApp.getFolderById("***redacted***") // replace this with the ID of the folder that contains the documents you want to convert

    Logger.log("Downloading " + documentRootFolder.getName() + "...");
    
    var pdfFolder = DriveApp.getFolderById("***redacted***"); // replace this with the ID of the folder that the PDFs should be put in. 

    var documentRootFiles = documentRootFolder.getFiles()

    while(documentRootFiles.hasNext()) {
        createPDF(documentRootFiles.next().getId(), pdfFolder.getId(), function (fileID, folderID) {
            if (fileID) createPDFfile(fileID, folderID);
        })
    }
}


function createPDF(fileID, folderID, callback) {
    var templateFile = DriveApp.getFileById(fileID);
    var templateName = templateFile.getName();
    
    var existingPDFs = DriveApp.getFolderById(folderID).getFiles();

    //in case no files exist
    if (!existingPDFs.hasNext()) {
        return callback(fileID, folderID);
    }

    for (; existingPDFs.hasNext();) {

        var existingPDFfile = existingPDFs.next();
        var existingPDFfileName = existingPDFfile.getName();
        if (existingPDFfileName == templateName + ".pdf") {
            Logger.log("PDF exists already. No PDF created")
            return callback();
        }
        if (!existingPDFs.hasNext()) {
            Logger.log(existingPDFfileName + " created")
            return callback(fileID, folderID)
        }
    }
}

function createPDFfile(fileID, folderID) {
    var templateFile = DriveApp.getFileById(fileID);
    var folder = DriveApp.getFolderById(folderID);
    var theBlob = templateFile.getBlob().getAs('application/pdf');
    var newPDFFile = folder.createFile(theBlob);
    newPDFFile.setName(templateFile.getName() + '.pdf');

}

关于迭代,我不明白什么?

我应该使用最佳实践方法吗?

javascript google-apps-script google-drive-api
1个回答
0
投票

Logger.log() 响应

我尝试了你的代码,一切正常,我遇到的问题是

for loop if condition statements response in your logger.log()

for (; existingPDFs.hasNext();) {

    var existingPDFfile = existingPDFs.next();
    var existingPDFfileName = existingPDFfile.getName();
    if (existingPDFfileName == templateName + ".pdf") {
        Logger.log("PDF exists already. No PDF created");
        return callback();
    }
    if (!existingPDFs.hasNext()) {
        Logger.log(existingPDFfileName + " created");
        return callback(fileID, folderID)
    }
}

我在你的第二个

variable
中更改了回复
if condition in your for loop

从此:

Logger.log(existingPDFfileName + " created");

对此:

Logger.log(templateName + " created")

整个代码:

function gdocToPDF() {

  // Replace this ID
  var documentRootFolder = DriveApp.getFolderById("***redacted***") // replace this with the ID of the folder that contains the documents you want to convert

  Logger.log("Downloading " + documentRootFolder.getName() + "...");


  var pdfFolder = DriveApp.getFolderById("***redacted***"); // replace this with the ID of the folder that the PDFs should be put in. 

  var documentRootFiles = documentRootFolder.getFiles()

  while (documentRootFiles.hasNext()) {
    createPDF(documentRootFiles.next().getId(), pdfFolder.getId(), function (fileID, folderID) {
      if (fileID) createPDFfile(fileID, folderID);
    })
  }
}


function createPDF(fileID, folderID, callback) {
  var templateFile = DriveApp.getFileById(fileID);
  var templateName = templateFile.getName();
  console.log(templateName);


  var existingPDFs = DriveApp.getFolderById(folderID).getFiles();

  //in case no files exist
  if (!existingPDFs.hasNext()) {
    return callback(fileID, folderID);
  } 

  for (; existingPDFs.hasNext();) {
    var existingPDFfile = existingPDFs.next();
    var existingPDFfileName = existingPDFfile.getName();
    if (existingPDFfileName == templateName + ".pdf") {
      Logger.log("PDF exists already. No PDF created")
      return callback();
    } 
    if (!existingPDFs.hasNext()) {
          Logger.log(templateName + " created")
          return callback(fileID, folderID)
        }
      }
    }

function createPDFfile(fileID, folderID) {
  var templateFile = DriveApp.getFileById(fileID);
  var folder = DriveApp.getFolderById(folderID);
  var theBlob = templateFile.getBlob().getAs('application/pdf');
  var newPDFFile = folder.createFile(theBlob);
  newPDFFile.setName(templateFile.getName() + '.pdf');

}

输出示例

基于脚本的示例文件夹。

执行前

Drive Photo 1

Drive Photo 2

Drive Photo

执行后

Drive Photo 4

此输出基于修改后的代码。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.