设置新单元格值时保留格式(Google 电子表格)
Preserve Formatting When Setting New Cell Value (Google Spreadsheet)
我有以下脚本可以为选定的电子表格单元格设置新值。它按预期工作,但 在每次输入后,它会从单元格 中清除所有以前的格式。我如何修改代码以确保它 保留所有部分格式,例如字体 weight/color? 谢谢您的帮助。
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:当将值添加到包含值的单元格时,您想保留单元格中文本的现有文本样式。
- 问题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@');
}
参考:
我有以下脚本可以为选定的电子表格单元格设置新值。它按预期工作,但 在每次输入后,它会从单元格 中清除所有以前的格式。我如何修改代码以确保它 保留所有部分格式,例如字体 weight/color? 谢谢您的帮助。
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:当将值添加到包含值的单元格时,您想保留单元格中文本的现有文本样式。
- 问题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@');
}