通过 Google App 脚本生成 PDF
Generate PDF through Google App Script
我找到了一个 script,它从活动 Google Spreadsheet 中的活动行获取字段,并使用 Google 文档模板创建 PDF用这些字段替换模板中的键。键的两边都有 %
来标识,例如%Name%
.
linked 代码向 UI 添加了一个菜单条目,因此用户只需单击一个单元格,然后 select 'Create PDF' 菜单选项.我想做一些改变,以满足我的需要。我的上下文是:
用户在每个单元格下拉列表中选择一个选项,分别位于C3、C5、C7和C9中。这些选择会触发我 sheet;
中的过滤器
用户点击一个按钮,根据sheet状态生成PDF报告;
如果设置了无效选项或报告生成成功,脚本将显示一条消息;
我当前的代码:
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')
}
我 link 那个按钮的脚本,但它没有获取单元格值,也没有生成 PDF。预期行为是基于 Doc 模板生成 PDF 文档,用 year
、month
和 total_cost
变量替换占位符。我做错了什么,我怎样才能达到预期的行为?
这个修改怎么样?我认为您的情况有几个答案。所以请将此视为其中之一。
修改点:
- 您可以像
copyDoc.replaceText('%' + replace_values[i] + '%', replace_values[i])
一样使用 copyDoc
。
var ss = SpreadsheetApp.getActiveSheet(),
后运行,sheet = ss.getSheets()[0],
处出错。
- 如果要使用索引为“0”的sheet,可以使用
var ss = SpreadsheetApp.getActiveSpreadsheet(),
的ss
。
- 在此修改中,我认为您可能还想使用其他索引。所以我用了
sheet = ss.getSheets()[0];
.
project = ss.getRange('C3').getValue(),
的 project
未在 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
}
注:
- 您还可以使用 Execution transcript.
确认脚本中的错误
参考资料:
如果这不是您想要的,请告诉我。我想修改一下。
我找到了一个 script,它从活动 Google Spreadsheet 中的活动行获取字段,并使用 Google 文档模板创建 PDF用这些字段替换模板中的键。键的两边都有 %
来标识,例如%Name%
.
linked 代码向 UI 添加了一个菜单条目,因此用户只需单击一个单元格,然后 select 'Create PDF' 菜单选项.我想做一些改变,以满足我的需要。我的上下文是:
用户在每个单元格下拉列表中选择一个选项,分别位于C3、C5、C7和C9中。这些选择会触发我 sheet;
中的过滤器
用户点击一个按钮,根据sheet状态生成PDF报告;
如果设置了无效选项或报告生成成功,脚本将显示一条消息;
我当前的代码:
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')
}
我 link 那个按钮的脚本,但它没有获取单元格值,也没有生成 PDF。预期行为是基于 Doc 模板生成 PDF 文档,用 year
、month
和 total_cost
变量替换占位符。我做错了什么,我怎样才能达到预期的行为?
这个修改怎么样?我认为您的情况有几个答案。所以请将此视为其中之一。
修改点:
- 您可以像
copyDoc.replaceText('%' + replace_values[i] + '%', replace_values[i])
一样使用copyDoc
。 var ss = SpreadsheetApp.getActiveSheet(),
后运行,sheet = ss.getSheets()[0],
处出错。- 如果要使用索引为“0”的sheet,可以使用
var ss = SpreadsheetApp.getActiveSpreadsheet(),
的ss
。 - 在此修改中,我认为您可能还想使用其他索引。所以我用了
sheet = ss.getSheets()[0];
.
- 如果要使用索引为“0”的sheet,可以使用
project
未在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();
- 你也可以使用像
project = ss.getRange('C3').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
}
注:
- 您还可以使用 Execution transcript. 确认脚本中的错误
参考资料:
如果这不是您想要的,请告诉我。我想修改一下。