使用Google Apps Script将电子表格中的单个工作表保存为PDF到特定文件夹

8
我正在使用 Google 电子表格来准备发票,并寻找一个简单的脚本,将发票所在的工作表保存到“发票”文件夹中以建立存档。我从 Stackoverflow 和 YouTube 上的许多贡献者那里“借用”了代码,并编写了一个可行的代码。我不得不将发票复制到新创建的电子表格中,因为似乎无法从类型为电子表格的单个工作表创建 PDF。我还必须使用一段代码将 PDF 从根目录移动到“发票”文件夹。唯一我无法解决的问题是第6行创建的电子表格包含2个工作表。一个空的和一个正确复制的。因此创建的 PDF 也有2个工作表,一个为空的,一个正确的。有人知道如何解决这个问题吗?另外,有时需要几分钟才能在文件夹中显示 PDF。
以下是代码:
function generatePdf(){
    //Create a temporary spreadsheet, to store the desired sheet from the spreadsheet in. 
    var originalSpreadsheet = SpreadsheetApp.getActive();
    originalSpreadsheet.setActiveSheet(originalSpreadsheet.getSheets()[4]);
    var name = "Testname"
    var newSpreadsheet = SpreadsheetApp.create(name);
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    sheet = originalSpreadsheet.getActiveSheet();
    sheet.copyTo(newSpreadsheet);
    //Save the desired sheet as pdf
    var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf');
    var saveCopy = DriveApp.createFile(pdf);
    //Delete temporary spreadsheet
    DriveApp.getFilesByName(name).next().setTrashed(true);
    //Move the pdf file from the rootfolder to the folder where invoices are to be stored.
    var files = DriveApp.getRootFolder().getFiles();
    while (files.hasNext()) {
        var file = files.next();
        var destination = DriveApp.getFolderById("0B3ok04PZOVbgLXA2dy14MVlLRXM");
        destination.addFile(file);
        var pull = DriveApp.getRootFolder();
        pull.removeFile(file);    
    }
}
1个回答

13

我不确定你是否遇到过这段代码,但你可以尝试一下:

function checkSheet() {
var sheetName = "Sheet1";
var folderID = "FOLDER_ID"; // Folder id to save in a folder.
var pdfName = "Invoice "+Date();

var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var folder = DriveApp.getFolderById(folderID);

//Copy whole spreadsheet
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

//delete redundant sheets
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() != sheetName){
destSpreadsheet.deleteSheet(sheets[i]);
}
}

var destSheet = destSpreadsheet.getSheets()[0];
//repace cell values with text (to avoid broken references) 
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);

//save to pdf
var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.createFile(theBlob);

//Delete the temporary sheet
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

Note: 测试此代码时,生成PDF文件会非常迅速,但这可能取决于发票模板。

参考资料:

希望对您有所帮助!

更新

enter image description here enter image description here


谢谢,这个方法差不多对我有用。一个“pdfish”文件被创建了,出现了一个PDF标志,但文件名没有PDF后缀,无法打开。我更改了两行代码:从以下代码中删除了.setName等内容:var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName); 并且在以下代码中将“tmp_convert_to_pdf”替换为pdfName:var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))。现在它可以正常工作了。再次感谢您的帮助。 - John
谢谢你的帮助,它让我找到了解决问题的方法,现在一切都正常工作。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接