使用正确的 formatString GAS 从电子表格创建 Google 文档
Creating a Google Doc from spreadsheet with the right formatString GAS
使用此脚本,我可以从模板和 Google 电子表格中的值创建 Google 文档。
它从 Google 电子表格(具有突出显示单元格或行的行)中的活动行中获取字段,并使用 Google 文档模板(由 TEMPLATE_ID 标识)使用这些字段替换模板中的占位符创建一个文档。
现在,问题是单元格的格式。
我会把 Google 文件中的内容完全按照电子表格中显示的内容拉入。
使用实际代码,如果我有:
- 在电子表格单元格中 € 18.532,78 ----> 在 Google 文档中出现 18532,7762
- 在电子表格单元格中 300,06 -----> 在 Google 文档中出现 300.06
我想把 Google 文档中的内容完全按照电子表格中的内容添加。
我该如何解决?
这是代码:
function myFubction() {
var tableColumn = [3,5]; // Table header is in column C to E
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var TEMPLATE_ID = 'xxx';
var ui = SpreadsheetApp.getUi();
if (TEMPLATE_ID === '') {
ui.alert('TEMPLATE_ID needs to be defined in code.gs')
return
}
var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy();
var copyId = copyFile.getId();
var copyDoc = DocumentApp.openById(copyId);
var FILE_NAME = ui.prompt('Insert the name of Google Doc', ui.ButtonSet.OK);
copyDoc.setName(FILE_NAME.getResponseText());
var copyBody = copyDoc.getBody();
var lastColumn = sheet.getLastColumn();
var activeRowIndex = sheet.getActiveRange().getRowIndex();
var activeRow = sheet.getRange(activeRowIndex, 1, 1, lastColumn).getValues()[0];
var headerRow = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
for (var columnIndex = 0; columnIndex < headerRow.length; columnIndex++) {
if (columnIndex === tableColumn[0] - 1) { // Check if column corresponds to table data
try {
var tableValues = sheet.getRange(2, tableColumn[0], sheet.getLastRow()-1,tableColumn[1]-tableColumn[0]+1).getValues();
var placeholder = `%${headerRow[tableColumn[0]-1]}%`;
var rangeElement = copyBody.findText(placeholder);
var element = rangeElement.getElement();
console.log(element.asText().getText())
var childIndex = copyBody.getChildIndex(element.getParent());
console.log(childIndex)
const elementText = copyBody.getChild(childIndex).asText().getText();
const [beforeText, afterText] = elementText.split(placeholder);
copyBody.getChild(childIndex).asText().setText('');
copyBody.insertParagraph(childIndex, beforeText);
copyBody.insertTable(childIndex+1, tableValues);
copyBody.insertParagraph(childIndex+2, afterText);
} catch(err) {
continue;
}
} else if (columnIndex < tableColumn[0] - 1 || columnIndex > tableColumn[1] - 1) {
var nextValue = formatString(activeRow[columnIndex]);
copyBody.replaceText('%' + headerRow[columnIndex] + '%', nextValue);
}
}
copyDoc.saveAndClose();
SpreadsheetApp.getUi().alert('Google Doc created!!')
}
这是我的 menu.gs formatString;
function formatString(value, options) {
var formattedValue = value
options = options || {}
if (typeof value === 'number') {
formattedValue = value.toLocaleString('de-DE', {currency: 'EUR', style: 'currency'});
} else if (value instanceof Date) {
var timeZone = Session.getScriptTimeZone()
var dateFormat = 'dd/MM/yyyy'
if (options.dateFormat !== undefined) {
dateFormat = options.dateFormat
}
formattedValue = Utilities.formatDate(value, timeZone, dateFormat)
} else if (typeof value === 'object') {
formattedValue = JSON.stringify(value)
}
return formattedValue
}
特别是对于这些情况,您可以使用 getDisplayValues
而不是 getValues
来修复它。这将在 return 中获取工作表中显示的值。
但这可能会干扰您的其他单元格,因为您正在重新格式化其他值,所以要小心。
使用此脚本,我可以从模板和 Google 电子表格中的值创建 Google 文档。
它从 Google 电子表格(具有突出显示单元格或行的行)中的活动行中获取字段,并使用 Google 文档模板(由 TEMPLATE_ID 标识)使用这些字段替换模板中的占位符创建一个文档。
现在,问题是单元格的格式。
我会把 Google 文件中的内容完全按照电子表格中显示的内容拉入。
使用实际代码,如果我有:
- 在电子表格单元格中 € 18.532,78 ----> 在 Google 文档中出现 18532,7762
- 在电子表格单元格中 300,06 -----> 在 Google 文档中出现 300.06
我想把 Google 文档中的内容完全按照电子表格中的内容添加。
我该如何解决?
这是代码:
function myFubction() {
var tableColumn = [3,5]; // Table header is in column C to E
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var TEMPLATE_ID = 'xxx';
var ui = SpreadsheetApp.getUi();
if (TEMPLATE_ID === '') {
ui.alert('TEMPLATE_ID needs to be defined in code.gs')
return
}
var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy();
var copyId = copyFile.getId();
var copyDoc = DocumentApp.openById(copyId);
var FILE_NAME = ui.prompt('Insert the name of Google Doc', ui.ButtonSet.OK);
copyDoc.setName(FILE_NAME.getResponseText());
var copyBody = copyDoc.getBody();
var lastColumn = sheet.getLastColumn();
var activeRowIndex = sheet.getActiveRange().getRowIndex();
var activeRow = sheet.getRange(activeRowIndex, 1, 1, lastColumn).getValues()[0];
var headerRow = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
for (var columnIndex = 0; columnIndex < headerRow.length; columnIndex++) {
if (columnIndex === tableColumn[0] - 1) { // Check if column corresponds to table data
try {
var tableValues = sheet.getRange(2, tableColumn[0], sheet.getLastRow()-1,tableColumn[1]-tableColumn[0]+1).getValues();
var placeholder = `%${headerRow[tableColumn[0]-1]}%`;
var rangeElement = copyBody.findText(placeholder);
var element = rangeElement.getElement();
console.log(element.asText().getText())
var childIndex = copyBody.getChildIndex(element.getParent());
console.log(childIndex)
const elementText = copyBody.getChild(childIndex).asText().getText();
const [beforeText, afterText] = elementText.split(placeholder);
copyBody.getChild(childIndex).asText().setText('');
copyBody.insertParagraph(childIndex, beforeText);
copyBody.insertTable(childIndex+1, tableValues);
copyBody.insertParagraph(childIndex+2, afterText);
} catch(err) {
continue;
}
} else if (columnIndex < tableColumn[0] - 1 || columnIndex > tableColumn[1] - 1) {
var nextValue = formatString(activeRow[columnIndex]);
copyBody.replaceText('%' + headerRow[columnIndex] + '%', nextValue);
}
}
copyDoc.saveAndClose();
SpreadsheetApp.getUi().alert('Google Doc created!!')
}
这是我的 menu.gs formatString;
function formatString(value, options) {
var formattedValue = value
options = options || {}
if (typeof value === 'number') {
formattedValue = value.toLocaleString('de-DE', {currency: 'EUR', style: 'currency'});
} else if (value instanceof Date) {
var timeZone = Session.getScriptTimeZone()
var dateFormat = 'dd/MM/yyyy'
if (options.dateFormat !== undefined) {
dateFormat = options.dateFormat
}
formattedValue = Utilities.formatDate(value, timeZone, dateFormat)
} else if (typeof value === 'object') {
formattedValue = JSON.stringify(value)
}
return formattedValue
}
特别是对于这些情况,您可以使用 getDisplayValues
而不是 getValues
来修复它。这将在 return 中获取工作表中显示的值。
但这可能会干扰您的其他单元格,因为您正在重新格式化其他值,所以要小心。