在 Google Apps 脚本中将模态对话框设为警报

问题描述 投票:0回答:1

此代码是通过 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());
  }
}

如果我无法将模式对话框更改为警报,我也只是调整模式对话框的大小,但我也失败了。有人可以帮忙吗?谢谢你。

google-sheets google-apps-script
1个回答
0
投票

建议的解决方案

您可以通过更改脚本来实现您想要的目标:

    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)
Window: open() method
在新选项卡中打开 PDF 文件,并使用
close()
将其立即关闭。我还从脚本中删除了
var range = certificateSheet.getRange("A1:A30");
,因为它没有被使用。

输出

© www.soinside.com 2019 - 2024. All rights reserved.