此 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');
}
关于迭代,我不明白什么?
我应该使用最佳实践方法吗?
我尝试了你的代码,一切正常,我遇到的问题是
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');
}
基于脚本的示例文件夹。
执行前
执行后
此输出基于修改后的代码。
参考: