通过Google App脚本生成PDF

时间:2018-07-07 17:34:19

标签: google-apps-script google-sheets google-docs export-to-pdf

我发现一个script,它从活动的Google Spreadsheet的活动行中获取字段,并使用Google Doc模板创建了一个PDF,这些字段替换了模板中的键。键的两边都有%,例如%Name%

链接的代码将一个菜单项添加到UI,因此用户只需单击一个单元格,然后选择“创建PDF”菜单选项。我想进行一些更改以满足我的需求。我的情况是:

  1. 用户在每个单元内下拉列表中选择一个选项,分别在C3,C5,C7和C9中找到。这些选择会触发我的工作表中的过滤器;

  2. 用户单击按钮以基于图纸状态生成PDF报告;

  3. 如果设置了无效选项或报告生成成功,脚本将显示一条消息;

我当前的代码:

var TEMPLATE_ID = ''
var PDF_FILE_NAME = ''

function checkEntries(){
  var ss = SpreadsheetApp.getActiveSheet(),
      sheet = ss.getSheets()[0],
      project = ss.getRange('C3').getValue(),
      month = ss.getRange('C5').getValue(),
      year = ss.getRange('C7').getValue();

  if(project === 'all' && month === 'all' && year === 'all'){
    SpreadsheetApp.getUi().alert('The report is always specific to a project in a specific year and month')
    return;
  }
}

function createPdf() {
  var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy(),
      copyId = copyFile.getId(),
      copyDoc = DocumentApp.openById(copyId),
      copyBody = copyDoc.getActiveSection();

  var ss = SpreadsheetApp.getActiveSheet(),
      sheet = ss.getSheets()[0],
      project = ss.getRange('C3').getValue(),
      total_cost = ss.getRange('C14').getValue(),
      month = ss.getRange('C7').getValue(),
      year = ss.getRange('C9').getValue();

  var replace_values = [];
  replace_values.push(total_cost, year, month)

  for (var i = 0; i < replace_values.length; i++) {
    copyBody.replaceText('%' + replace_values[i] + '%', 
                         replace_values[i])          
  }
  copyDoc.saveAndClose()

  var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'))  
  if (PDF_FILE_NAME !== '') {
    newFile.setName(PDF_FILE_NAME)
  } 

  copyFile.setTrashed(true)

  SpreadsheetApp.getUi().alert('report generated successfully')
} 

我将该脚本链接到一个按钮,但是它无法获取单元格值,并且不会生成PDF。预期的行为是基于Doc模板生成PDF doc,并用yearmonthtotal_cost变量替换占位符。我在做错什么,如何才能达到预期的行为?

1 个答案:

答案 0 :(得分:1)

此修改如何?我认为您的情况有几个答案。因此,请将此视为其中之一。

修改点:

  • 您可以像copyDoc一样使用copyDoc.replaceText('%' + replace_values[i] + '%', replace_values[i])
  • 运行var ss = SpreadsheetApp.getActiveSheet(),后,在sheet = ss.getSheets()[0],处发生错误。
    • 如果要使用索引为“ 0”的工作表,可以使用ss中的var ss = SpreadsheetApp.getActiveSpreadsheet(),
    • 在此修改中,我认为您可能还希望使用其他索引。所以我用了sheet = ss.getSheets()[0];
  • project中未使用
  • project = ss.getRange('C3').getValue(),中的createPdf()
  • var replace_values = []; replace_values.push(total_cost, year, month)var replace_values = [total_cost, year, month];相同。
    • 您也可以使用[total_cost, month, year] = [sheet.getRange('C14').getValue(), sheet.getRange('C7').getValue(), sheet.getRange('C9').getValue()];之类的解构分配,而不是total_cost = sheet.getRange('C14').getValue(),month = sheet.getRange('C7').getValue(),year = sheet.getRange('C9').getValue();

当这些内容反映到修改后的脚本时,请进行以下修改。

来自:
var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy(),
    copyId = copyFile.getId(),
    copyDoc = DocumentApp.openById(copyId),
    copyBody = copyDoc.getActiveSection();
var ss = SpreadsheetApp.getActiveSheet(),
    sheet = ss.getSheets()[0],
    project = ss.getRange('C3').getValue(),
    total_cost = ss.getRange('C14').getValue(),
    month = ss.getRange('C7').getValue(),
    year = ss.getRange('C9').getValue();
var replace_values = [];
replace_values.push(total_cost, year, month)
for (var i = 0; i < replace_values.length; i++) {
  copyBody.replaceText('%' + replace_values[i] + '%', replace_values[i])
}
至 :
var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy(),
    copyId = copyFile.getId(),
    copyDoc = DocumentApp.openById(copyId);
var ss = SpreadsheetApp.getActiveSpreadsheet(), // Modified
    sheet = ss.getSheets()[0],
    total_cost = sheet.getRange('C14').getValue(), // Modified
    month = sheet.getRange('C7').getValue(), // Modified
    year = sheet.getRange('C9').getValue(); // Modified
var replace_values = [total_cost, year, month]; // Modified
for (var i = 0; i < replace_values.length; i++) {
  copyDoc.replaceText('%' + replace_values[i] + '%', replace_values[i]); // Modified
}

注意:

参考文献:

如果这不是您想要的,请告诉我。我想修改它。