从电子表格创建具有正确格式的Google Doc字符串GAS

人气:1,172 发布:2022-10-16 标签: google-docs google-apps-script google-sheets format-string

问题描述

使用此脚本,我可以根据模板和Google电子表格中的值创建一个Google Doc。

它从Google电子表格的活动行(具有突出显示的单元格或行的行)中获取字段,并使用Google Doc模板(由TEMPLATE_ID标识)创建一个文档,其中这些字段替换模板中的占位符。

现在,问题出在单元格的格式上。 我会把显示在电子表格中的Google Doc一模一样地放进去。 如果我有,请使用实际代码:

在电子表格单元格EURO 18.532,78-&>谷歌文档中出现18532,7762 在电子表格单元格300中,谷歌文档中的06-&>显示为300.06

我会拉入与电子表格中显示的完全相同的Google Doc。 我该如何解决? 代码如下:

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!!')     
}

这是我的格式字符串菜单;

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来修复它。这将反过来获得在工作表中显示的值。

但这可能会干扰您的其他单元格,因为您正在重新设置其他值的格式,因此请小心。

519