![](/img/trans.png)
[英]How to set a value of a cell in google spread sheet using script editor?
[英]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
。如果我的理解是正確的,這個答案怎么樣? 請將此視為幾種可能的答案之一。
本次修改流程如下。
getRange(1,1,37,9)
的臨時工作表。當您的腳本被修改時,請進行如下修改。
從: // 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.