目標:自動插入檔案名以下載為 PDF。
我已經撰寫了一個腳本,該腳本打開了一個列印預覽螢屏,允許我列印選定的單元格。它還有一個下載按鈕,允許我將預覽下載為 PDF。我希望能夠從 3 個單元格的組合中設定檔案名。名稱('C6:J6') 日期('L54:N54') 時間('S54:U54')。這些單元格都在正在列印的同一張紙上。我不知道如何做到這一點。
下面是我的腳本和我的列印預覽螢屏的螢屏截圖。帶圓圈的是我要替換的檔案名和打開標準下載檔案螢屏的下載按鈕。先感謝您!
//https://stackoverflow.com/questions/58627501/how-to-print-sheet-range-using-gs-script-in-google-sheets
//https://xfanatical.com/blog/print-google-sheet-as-pdf-using-apps-script/
function printCQF() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A1:AN59').activate();
spreadsheet.setCurrentCell(spreadsheet.getRange('AN59'));
printSelectedRange();
};
var PRINT_OPTIONS = {
'size': 0, // paper size. 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B
'fzr': false, // repeat row headers
'portrait': true, // false=landscape
'scale': 3, //1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
'top_margin':0.25, //All four margins must be set!
'bottom_margin':0.25, //All four margins must be set!
'left_margin':0.2, //All four margins must be set!
'right_margin':0.2, //All four margins must be set!
'gridlines': true, // show gridlines
'printnotes':false, //true/false'
'printtitle': false,
'sheetnames': false,
'pagenum': 'UNDEFINED', // CENTER = show page numbers / UNDEFINED = do not show
'attachment': false
}
var PDF_OPTS = objectToQueryString(PRINT_OPTIONS);
/*
// Creates a custom menu.
function onOpen(e) {
SpreadsheetApp.getUi().createMenu('Print...').addItem('Print selected range', 'printCQF').addToUi();
}
*/
function printSelectedRange() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
var gid = sheet.getSheetId();
var printRange = objectToQueryString({
'c1': range.getColumn() - 1,
'r1': range.getRow() - 1,
'c2': range.getColumn() range.getWidth() - 1,
'r2': range.getRow() range.getHeight() - 1
});
var url = ss.getUrl().replace(/edit$/, '') 'export?format=pdf' PDF_OPTS printRange "&gid=" gid;
var htmlTemplate = HtmlService.createTemplateFromFile('js');
htmlTemplate.url = url;
SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), 'Print range');
}
function objectToQueryString(obj) {
return Object.keys(obj).map(function(key) {
return Utilities.formatString('&%s=%s', key, obj[key]);
}).join('');
}

uj5u.com熱心網友回復:
您需要下載檔案 using UrlFetchApp.fetch(),根據fetch()using的回應創建檔案DriveApp.createFile(),重命名,獲取新創建檔案的 URL 并將其設定為htmlTemplate.url.
將代碼中的替換為printSelectedRange():
function printSelectedRange() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
var gid = sheet.getSheetId();
var printRange = objectToQueryString({
'c1': range.getColumn() - 1,
'r1': range.getRow() - 1,
'c2': range.getColumn() range.getWidth() - 1,
'r2': range.getRow() range.getHeight() - 1
});
var url = ss.getUrl().replace(/edit$/, '') 'export?format=pdf' PDF_OPTS printRange "&gid=" gid;
var params = {method:"GET",headers:{"authorization":"Bearer " ScriptApp.getOAuthToken()}};
var response = UrlFetchApp.fetch(url, params).getBlob();
var name = sheet.getRange('C6:J6').getDisplayValue();
var date = sheet.getRange('L54:N54').getDisplayValue();
var time = sheet.getRange('S54:U54').getDisplayValue();
var filename = name "-" date "-" time;
//create new file on drive
var newFile = DriveApp.createFile(response).setName(filename);
var htmlTemplate = HtmlService.createTemplateFromFile('js');
htmlTemplate.url = newFile.getUrl();
SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), 'Print range');
}
示例輸出:

注意:如果要在列印后洗掉生成的檔案,可以在函式newFile.setTrashed(true);末尾添加。printSelectedRange()這會將檔案移動到垃圾箱。垃圾箱中的檔案將在 30 天后自動洗掉。
參考:
- DriveApp.createFile(blob)
- UrlFetchApp.fetch()
- File.setTrashed(布林值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/431135.html
下一篇:如何在不包括小時的情況下比較日期
