【发布时间】:2023-02-06 22:11:20
【问题描述】:
这是我的谷歌脚本,它从谷歌表格中提取信息并从模板生成发票。
function Invoice2() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let overview = ss.getSheetByName("Overview");
let ssn = ss.getSheetByName(ss.getRange("F13").getDisplayValue());
// Template and folder details
let templateID = overview.getRange("H20").getDisplayValue();
let folderidID = overview.getRange("H19").getDisplayValue();
let folder = DriveApp.getFolderById(folderidID);
// File name
let namedata = overview.getRange("C19").getDisplayValue();
let monthdata = ssn.getRange("F13").getDisplayValue();
let yeardata = overview.getRange("F14").getDisplayValue();
let fileName = namedata + ' ' + monthdata + ' ' + "Invoice" + ' ' + yeardata;
// Rates and hours
let sessionHourlyRate = ssn.getRange("G2").getDisplayValue();
let opwHourlyRate = ssn.getRange("G6").getDisplayValue();
let sessionhours = ssn.getRange("G3").getDisplayValue();
let otherPaidWorkHours = ssn.getRange("G7").getDisplayValue();
// Totals
let stotaldata = ssn.getRange("G4").getDisplayValue();
let opwtotal = ssn.getRange("G8").getDisplayValue();
let allTotal = ssn.getRange("G11").getDisplayValue();
// Bank details
let bankName = overview.getRange("D19").getDisplayValue();
let sortCode = overview.getRange("E19").getDisplayValue();
let accountNumber = overview.getRange("F19").getDisplayValue();
// Copy the template and open it as a document
let file = DriveApp.getFileById(templateID);
let copy = file.makeCopy(fileName, folder);
let doc = DocumentApp.openById(copy.getId());
let body = doc.getBody();
// Replace text placeholders with values from the spreadsheet
body.replaceText('<NAME>', namedata);
body.replaceText('<MONTH>', monthdata);
body.replaceText('<YEAR>', yeardata);
body.replaceText('<HR>', sessionHourlyRate);
body.replaceText('<OPWHR>', opwHourlyRate);
body.replaceText('<SHOUR>', sessionhours);
body.replaceText('<OPWHOUR>', otherPaidWorkHours);
body.replaceText('<STOTAL>', stotaldata);
body.replaceText('<OPWTOTAL>', opwtotal);
body.replaceText('<ALLTOTAL>', allTotal);
body.replaceText('<BANKNAME>', bankName);
body.replaceText('<AN>', accountNumber);
body.replaceText('<SC>', sortCode);
var srcData = ssn.getRange("A1:E50").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
table = body.appendTable(srcData);
table.getRow(0).editAsText().setBold(true);
}
该脚本有效,但我有一些问题都与这部分代码有关
var srcData = ssn.getRange("A1:E50").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
table = body.appendTable(srcData);
table.getRow(0).editAsText().setBold(true);
}
首先,单元格 A1 应该是“名称”,但由于某种原因它正在生成一个数值。此外,并非“A1:E50”范围内的所有值都被填充,是否有添加 5 个标准化标题然后从 A2:E 中提取数据的方法?由于 A1:E 行只是标题,所以如果每行的单元格 A 中有一个值,脚本只会拉入每一行 A:E。最后,我希望它在文档中的表格右侧生成一个空列。我会选择范围为“A1:F50”,但 F 的单元格包含与生成的表不相关的数据。
我试过用这个代替
var srcData = ssn.getRange("A1:E50,S1:S").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
table = body.appendTable(srcData);
table.getRow(0).editAsText().setBold(true);
> }
由于 S 列为空但脚本中断。
【问题讨论】:
标签: google-apps-script google-sheets