此代码是通过 ChatGPT 编写的。我想将模式对话框更改为警报,但如果这样做,将在新选项卡中打开的 PDF 文件将无法工作。还有其他方法吗?
function generateCPDCertificate() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var certificateSheet = spreadsheet.getSheetByName("Certificate");
// Check if AG cell needs to be updated
var sheetName = certificateSheet.getRange("D4").getValue();
var targetSheet = spreadsheet.getSheetByName(sheetName);
var targetCell = targetSheet.getRange("D:D").createTextFinder(certificateSheet.getRange("D6").getValue()).findNext();
var agCell = targetCell.offset(0, 28); // Assuming AG is 28 columns to the right of D
if (agCell.isBlank()) {
// Define the range to be included in the PDF
var range = certificateSheet.getRange("A1:A30");
// Define the filename
var filename = certificateSheet.getRange("D4").getValue() + "_" + certificateSheet.getRange("B6").getValue() + "_" + certificateSheet.getRange("D6").getValue() + ".pdf";
// Export the range as a PDF
var url = spreadsheet.getUrl();
var exportUrl = url.replace(/\/edit.*$/, '') + '/export?format=pdf&size=A4&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenum=false&gridlines=false&horizontal_alignment=CENTER&vertical_alignment=TOP';
var options = {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
};
var response = UrlFetchApp.fetch(exportUrl + "&gid=" + certificateSheet.getSheetId() + "&range=A1:A30", options);
var blob = response.getBlob().setName(filename);
// Create or get the "CPD Certificate" folder
var folderName = "CPD Certificate";
var folderIterator = DriveApp.getFoldersByName(folderName);
var folder;
if (folderIterator.hasNext()) {
folder = folderIterator.next();
} else {
folder = DriveApp.createFolder(folderName);
}
// Delete existing files in the "CPD Certificate" folder
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
file.setTrashed(true);
}
// Save the PDF file to "CPD Certificate" folder
var pdfFileInDrive = folder.createFile(blob);
// Set permissions to 'anyone can view'
pdfFileInDrive.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
// Open the PDF file using the Mozilla PDF Viewer
var pdfUrl = pdfFileInDrive.getUrl();
var message = "The PDF file is now open in the new tab.";
var html = '<div style="width: 300px; height: 150px;">' + message + '</div><script>window.open("' + pdfUrl + '", "_blank");</script>';
var userInterface = HtmlService.createHtmlOutput(html);
// Show the modal dialog
SpreadsheetApp.getUi().showModalDialog(userInterface, "Generate CPD Certificate");
// Update AG cell with today's date
agCell.setValue(new Date());
} else {
// Display message if AG cell is not blank
SpreadsheetApp.getUi().alert("This certificate is already printed: " + agCell.getValue());
}
}
如果我无法将模式对话框更改为警报,我也只是调整模式对话框的大小,但我也失败了。有人可以帮忙吗?谢谢你。
您可以通过更改脚本来实现您想要的目标:
var message = "The PDF file is now open in the new tab.";
var html = '<div style="width: 300px; height: 150px;">' + message + '</div>window.open("' + pdfUrl + '", "_blank");';
var userInterface = HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModalDialog(userInterface, "Generate CPD Certificate");
agCell.setValue(new Date());
} else {
SpreadsheetApp.getUi().alert("This certificate is already printed: " + agCell.getValue());
}
致:
var alert = SpreadsheetApp.getUi().alert("Generate CPD Certificate", "Do you want to proceed with generating the CPD certificate?", SpreadsheetApp.getUi().ButtonSet.YES_NO);
if (alert == SpreadsheetApp.getUi().Button.YES) {
var userInterface = HtmlService.createHtmlOutput('window.open("' + pdfUrl + '");google.script.host.close();');
SpreadsheetApp.getUi().showModalDialog(userInterface, 'Opening PDF...');
agCell.setValue(new Date());
} else {
SpreadsheetApp.getUi().alert("Operation Cancelled");
}
} else {
SpreadsheetApp.getUi().alert("This certificate is already printed: " + agCell.getValue());
}
完整的代码将变为:
function generateCPDCertificate() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var certificateSheet = spreadsheet.getSheetByName("Certificate");
var sheetName = certificateSheet.getRange("D4").getValue();
var targetSheet = spreadsheet.getSheetByName(sheetName);
var targetCell = targetSheet.getRange("D:D").createTextFinder(certificateSheet.getRange("D6").getValue()).findNext();
var agCell = targetCell.offset(0, 28);
if (agCell.isBlank()) {
var filename = certificateSheet.getRange("D4").getValue() + "_" + certificateSheet.getRange("B6").getValue() + "_" + certificateSheet.getRange("D6").getValue() + ".pdf";
var url = spreadsheet.getUrl();
var exportUrl = url.replace(/\/edit.*$/, '') + '/export?format=pdf&size=A4&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenum=false&gridlines=false&horizontal_alignment=CENTER&vertical_alignment=TOP';
var options = {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
};
var response = UrlFetchApp.fetch(exportUrl + "&gid=" + certificateSheet.getSheetId() + "&range=A1:A30", options);
var blob = response.getBlob().setName(filename);
var folderName = "CPD Certificate";
var folderIterator = DriveApp.getFoldersByName(folderName);
var folder;
if (folderIterator.hasNext()) {
folder = folderIterator.next();
} else {
folder = DriveApp.createFolder(folderName);
}
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
file.setTrashed(true);
}
var pdfFileInDrive = folder.createFile(blob);
pdfFileInDrive.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
var pdfUrl = pdfFileInDrive.getUrl();
var alert = SpreadsheetApp.getUi().alert("Generate CPD Certificate", "Do you want to proceed with generating the CPD certificate?", SpreadsheetApp.getUi().ButtonSet.YES_NO);
if (alert == SpreadsheetApp.getUi().Button.YES) {
var userInterface = HtmlService.createHtmlOutput('window.open("' + pdfUrl + '");google.script.host.close();');
SpreadsheetApp.getUi().showModalDialog(userInterface, 'Opening PDF...');
agCell.setValue(new Date());
} else {
SpreadsheetApp.getUi().alert("Operation Cancelled");
}
} else {
SpreadsheetApp.getUi().alert("This certificate is already printed: " + agCell.getValue());
}
}
作为提示,使用alert(title, prompt, buttons)
和showModalDialog(userInterface, title)
在新选项卡中打开 PDF 文件,并使用Window: open() method
将其立即关闭。我还从脚本中删除了close()
,因为它没有被使用。var range = certificateSheet.getRange("A1:A30");