【问题标题】:Using Google Apps Script to save a single sheet from a spreadsheet as pdf in a specific folder使用 Google Apps 脚本将电子表格中的单个工作表保存为特定文件夹中的 pdf
【发布时间】:2026-02-17 06:10:02
【问题描述】:

我正在使用 Google 电子表格来准备发票,并且正在寻找一个简单的脚本,该脚本可以将发票所在的工作表保存在“发票”文件夹中以构建存档。 我从 * 和 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);    
    }
}

【问题讨论】:

    标签: pdf google-apps-script google-sheets google-drive-api


    【解决方案1】:

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

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

    注意: 在测试此代码时,它会立即创建 pdf,但它可能取决于发票模板。

    参考资料:

    希望这会有所帮助!

    更新

    【讨论】:

    • 谢谢它几乎对我有用。创建了“pdfish”文件,显示了 pdf 徽标,但文件名没有 pdf 后缀,无法打开。我更改了两行:我从以下行中删除了 .setName 等: var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);并用 pdfName 替换 var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) 行中的“tmp_convert_to_pdf”。现在它工作正常。感谢您的帮助。
    • 感谢您的帮助,它使我找到了解决问题的方法,并且效果很好。
    最近更新 更多