簡體   English   中英

如何使用 Google 腳本從電子表格的選定單元格區域生成 PDF?

[英]How to generate PDF from a selected cell area of a spread sheet with Google script?

這是我在下面看到的原始電子表格。

在此處輸入圖片說明

我正在嘗試通過按下“導出 PDF”按鈕從我的 Google 表格創建 PDF。

我在嘗試根據我的 google-sheet 上的選定單元格生成 PDF 時遇到問題。 (在左側,將菜單區域保留在外面)

我嘗試了幾種方法,但似乎無法解決它。

var theBlob = destSpreadsheet.getRange("A1:I37").getBlob().getAs('application/pdf').setName(pdfName);

...但它仍然生成整個電子表格。

我只想從A1:I37生成 PDF

有人可以看到我的代碼並指導我嗎?

  function generatePdf() {
  // Get active spreadsheet.
  var sourceSpreadsheet = SpreadsheetApp.getActive();

  // Get active sheet.
  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);

  // Set the output filename as SheetName.
  var pdfName = sourceSheet.getRange(6,8).getValue() + "_" + sourceSheet.getRange(17,11).getValue() +"_"+ sourceSheet.getRange(8,4).getValue();

  // Get folder which to save pdf in.
  //var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  var date = new Date();
  var year= date.getFullYear();
  var mt = date.getMonth();
  var month     
  if  (mt === 0) {
   month = "January";
  }if (mt === 1) {
   month = "February";
  }if (mt === 2) {
   month = "March";
  }if (mt === 3) {
   month = "April";
  }if (mt === 4) {
   month = "May";
  }if (mt === 5) {
   month = "June";   
  }if (mt === 6) { 
   month = "July"; 
  }if (mt === 7) {
   month = "August";  
  }if (mt === 8) {
   month = "September";  
  }if (mt === 9) {
   month = "October";  
  }if (mt === 10){
  month = "November";
  }else if (mt === 11){
  month = "December";
  }
  var parents = DriveApp.getFoldersByName("Cliff Q "+month+" "+year);
  Logger.log(parents)
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  // 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]);
     Logger.log(destSpreadsheet);

    }
  }

  var destSheet = destSpreadsheet.getSheets()[0];

  // Repace cell values with text (to avoid broken references).
  var sourceRange = sourceSheet.getRange(1,1,37,9);
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1,1,37,9);
  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);
}'''

更新

我嘗試刪除右邊的 3 列,但我的按鈕仍會出現在 PDF 上。 代碼和生成的 PDF 可以在下面看到。

    '''// Copy whole spreadsheet.
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))
  var destSheet = destSpreadsheet.getSheets()[0];

  // Replace cell values with text (to avoid broken references).
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getDisplayValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);

// Delete redundant sheets.
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() != sheetName){
destSpreadsheet.deleteSheet(sheets[i]);
destSpreadsheet.deleteColumns(10,1);

}
}

  // 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 屏幕截圖。 按鈕仍然存在,整個電子表格被導出而不是所選區域。

我已經平方了我想要導出的區域。

當我對您的情況的理解正確時,我認為在您的腳本中,可能會出現以下問題。

  • destSpreadsheet導出為PDF文件時, destRange.setValues(sourcevalues);的結果destRange.setValues(sourcevalues); 可能不會反映到電子表格中。
  • 由於var destSheet = destSpreadsheet.getSheets()[0]具有單元格中的值,因此可能會保留除getRange(1,1,37,9)之外的范圍。
  • 除了getRange(1,1,37,9)范圍之外的單元getRange(1,1,37,9)被保留。
  • 源工作表包括從其他電子表格中檢索到的值。 例如,使用IMPORTRANGE

如果我的理解是正確的,這個答案怎么樣? 請將此視為幾種可能的答案之一。

流動:

本次修改流程如下。

  1. 在源電子表格中插入新工作表作為臨時工作表。
  2. 將活動工作表中的值和單元格格式復制到范圍為getRange(1,1,37,9)的臨時工作表。
  3. 將源電子表格復制為目標電子表格。
  4. 對於源電子表格,刪除臨時表。
  5. 對於目標電子表格,刪除臨時工作表以外的工作表。
  6. 將目標電子表格導出為 PDF 文件。

修改后的腳本:

當您的腳本被修改時,請進行如下修改。

從:
 // 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]); Logger.log(destSpreadsheet); } } var destSheet = destSpreadsheet.getSheets()[0]; // Repace cell values with text (to avoid broken references). var sourceRange = sourceSheet.getRange(1,1,37,9); var sourcevalues = sourceRange.getValues(); var destRange = destSheet.getRange(1,1,37,9); 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);
到:
 // --- Below script was added. var tempSheetName = "tempSheet"; // var tempSheet = sourceSpreadsheet.insertSheet(tempSheetName); // <--- Modified var tempSheet = sourceSheet.copyTo(sourceSpreadsheet).setName(tempSheetName); // <--- Added tempSheet.clearFormats(); // <--- Added var srcRange = sourceSheet.getRange(1,1,37,9); var dstRange = tempSheet.getRange(1,1,37,9); srcRange.copyTo(dstRange, {contentsOnly: true}); srcRange.copyTo(dstRange, {formatOnly: true}); tempSheet.getImages().forEach(function(e) {if (e.getAnchorCell().getColumn() > 9) e.remove()}); // <--- Added SpreadsheetApp.flush(); // --- // Copy whole spreadsheet. var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) sourceSpreadsheet.deleteSheet(tempSheet); // <--- Added // Delete redundant sheets. var sheets = destSpreadsheet.getSheets(); for (i = 0; i < sheets.length; i++) { if (sheets[i].getSheetName() != tempSheetName){ // <--- Modified destSpreadsheet.deleteSheet(sheets[i]); Logger.log(destSpreadsheet); } } // Save to pdf. var theBlob = destSpreadsheet.getBlob().setName(pdfName); // <--- Modified var newFile = folder.createFile(theBlob); // Delete the temporary sheet. DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);

筆記:

  • 使用destSpreadsheet.getBlob() ,此 mimeType 為application/pdf 所以你可以使用var theBlob = destSpreadsheet.getBlob().setName(pdfName)

參考:

如果我誤解了您的情況並且這不是您問題的直接解決方案,我深表歉意。 屆時,您能否提供一份示例電子表格來復制您的問題? 通過這個,我想修改它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM