设置新的单元格值时保留格式(Google电子表格)

时间:2020-09-28 01:34:03

标签: javascript html google-apps-script google-sheets google-sheets-api

我有以下脚本,该脚本为选定的电子表格单元格设置了新值。它可以按预期工作,但是在每次输入后,它将清除单元格中所有以前的格式。我如何修改代码以确保它保留所有部分格式,例如字体粗细/颜色??谢谢您的帮助。

function enterName1(options1, activity1, number1) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var cell = sheet.getActiveCell();
  var value = cell.getValue();
  var formattedDate = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yy' at 'HH:mm");
  Logger.log(formattedDate);
  
  if (value === '') {
      value = value + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
      sheet.getActiveRange().setNumberFormat('@STRING@');
      cell.setValue(value);
  } else {
      value = value + "\n\n" + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
      sheet.getActiveRange().setNumberFormat('@STRING@');
      cell.setValue(value);
  }
}

1 个答案:

答案 0 :(得分:2)

我相信您的目标如下。

  • 问题1:当将值添加到包含值的单元格中时,您想要保留单元格中文本的现有文本样式。
  • 问题2:将值添加到包含值的单元格时,您想保留单元格中文本的现有文本样式。另外,您还想为添加文本的formattedDate设置文本样式。-问题3:当将值添加到包含值的单元格中时,您想要保留单元格中文本的现有文本样式。另外,您还想为添加的文本中的formattedDate设置文本样式。而且,即使单元格为空,您也要为formattedDate的添加文本设置文本样式。

问题1的答案:

修改点:

  • 在这种情况下,需要检索现有值的文本样式并在添加值后设置文本样式。为此使用“ RichTextValue”。

修改脚本后,它如下所示。

修改后的脚本:

从:
} else {
    value = value + "\n\n" + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
    sheet.getActiveRange().setNumberFormat('@STRING@');
    cell.setValue(value);
}
至:
} else {
  value = value + "\n\n" + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
  var richTextValue = cell.getRichTextValue();
  var existingStyles = richTextValue.getRuns().map(e => ({start: e.getStartIndex(), end: e.getEndIndex(), style: e.getTextStyle()}));
  var richTexts = SpreadsheetApp.newRichTextValue().setText(value);
  existingStyles.forEach(e => richTexts.setTextStyle(e.start, e.end, e.style));
  cell.setRichTextValue(richTexts.build());
  cell.setNumberFormat('@STRING@');
}
  • 在此修改后的脚本中,设置了现有值的文本样式。因此,添加的文本没有文本样式。请注意这一点。

问题2的答案:

修改点:

  • 在这种情况下,需要检索现有值的文本样式,还需要为formattedDate设置文本样式,然后在添加值之后设置文本样式。 “ RichTextValue”也用于此。

修改脚本后,它如下所示。

修改后的脚本:

从:
} else {
    value = value + "\n\n" + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
    sheet.getActiveRange().setNumberFormat('@STRING@');
    cell.setValue(value);
}
至:
} else {
  var textStyle = SpreadsheetApp.newTextStyle().setBold(true).setForegroundColor("#FF0000").build();  // Please set this for the additional text.
  
  var richTextValue = cell.getRichTextValue();
  var existingStyles = richTextValue.getRuns().map(e => ({start: e.getStartIndex(), end: e.getEndIndex(), style: e.getTextStyle()}));
  var startOffset = (value + "\n\n" + "? ").length;
  existingStyles.push({start: startOffset, end: startOffset + formattedDate.length, style: textStyle});
  var richTexts = SpreadsheetApp.newRichTextValue().setText(value + "\n\n" + "到 " + formattedDate + " call " + options1 + number1 + ": " + activity1);
  existingStyles.forEach(e => richTexts.setTextStyle(e.start, e.end, e.style));
  cell.setRichTextValue(richTexts.build());
  cell.setNumberFormat('@STRING@');
}
  • 在此修改后的脚本中,设置了现有值的文本样式和添加文本的formattedDate
  • 如上例所示,formattedDate具有粗体和红色字体颜色。

问题3的答案:

修改点:

  • 在这种情况下,需要检索现有值的文本样式,还需要为formattedDate设置文本样式,然后在添加值之后设置文本样式。 “ RichTextValue”也用于此目的。而且,当单元格为空时,需要为添加的文本中的formattedDate设置文本样式。

修改脚本后,它如下所示。

修改后的脚本:

从:
if (value === '') {
    value = value + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
    sheet.getActiveRange().setNumberFormat('@STRING@');
    cell.setValue(value);
} else {
    value = value + "\n\n" + "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
    sheet.getActiveRange().setNumberFormat('@STRING@');
    cell.setValue(value);
}
至:
var textStyle = SpreadsheetApp.newTextStyle().setBold(true).setForegroundColor("#FF0000").build();  // Please set this for the additional text.
if (value === '') {
  value = "? " + formattedDate + " call " + options1 + number1 + ": " + activity1;
  var richTexts = SpreadsheetApp
    .newRichTextValue()
    .setText("? " + formattedDate + " call " + options1 + number1 + ": " + activity1)
    .setTextStyle(("? ").length, ("? " + formattedDate).length, textStyle);
  cell.setRichTextValue(richTexts.build());
  cell.setNumberFormat('@STRING@');
} else {
  var richTextValue = cell.getRichTextValue();
  var existingStyles = richTextValue.getRuns().map(e => ({start: e.getStartIndex(), end: e.getEndIndex(), style: e.getTextStyle()}));
  var startOffset = (value + "\n\n" + "? ").length;
  existingStyles.push({start: startOffset, end: startOffset + formattedDate.length, style: textStyle});
  var richTexts = SpreadsheetApp.newRichTextValue().setText(value + "\n\n" + "到 " + formattedDate + " call " + options1 + number1 + ": " + activity1);
  existingStyles.forEach(e => richTexts.setTextStyle(e.start, e.end, e.style));
  cell.setRichTextValue(richTexts.build());
  cell.setNumberFormat('@STRING@');
}

参考: