Google 将自定义函数编写为 return 富文本
Google Script custom function to return rich text
所以...我构建了一个自定义函数,可以在单个单元格中处理来自 Gsheet 和 return 的值。简而言之,来源 sheet 一栏包含地点,一栏包含在这些地点提供的服务,另一栏包含结束日期。自定义函数收集在确定的日期在同一地点提供的所有服务。它已经在工作并且几乎给了我预期的 return.
返回的字符串:
-> 地点 1:
- 服务 1;
- 服务 2.
-> 地方 2:
- 服务 3;
- 服务 4。
想要return:
-> 地点 1:
- 服务 1;
- 服务 2.
-> 地点 2:
- 服务 3;
- 服务 4.
我已经搜索过RichTextValue的用法,不知道是因为我是作为自定义函数的return使用的还是我不知道怎么用它正确,但它不工作。这是我用来测试函数的示例代码:
function test(){
var bold=SpreadsheetApp.newTextStyle().setBold(true).build();
var test=SpreadsheetApp.newRichTextValue().setText("test").setTextStyle(0,2,bold).build().getText();
return test;
}
这很明显,有人会说 "getText()" return 是包含在 RichTextValue 中的字符串,所以它不会 return RichText,我知道。所以我在 "build()" 之后尝试了 "getRuns().join()" (加入是因为 getRuns returns 数组),我得到了这个结果: "com.google.apps.maestro.server.beans.trix.impl.RichTextValueApiAdapter@2d54d6e,com.google.apps.maestro.server.beans.trix.impl.RichTextValueApiAdapter@4c67374a".
所以 我的问题 是,是否有 "getRichText()" 作为我的自定义函数的 return 或任何其他方式来做到这一点?
提前致谢。
实际上不可能return自定义函数的格式化数据,只能是原始值。
您可以使用条件格式或制作自定义菜单或按钮,这样您就可以 运行 构建值及其格式的函数。
像这样:
// on its startup (Simple trigger) it runs the onOpen function that creates a custom menu and adds a menu item that when clicked runs the function "appendValuestoSheet"
function onOpen(){
SpreadsheetApp.getUi()
.createMenu("My Custom Menu")
.addItem("Calculate Values", "appendValuestoSheet")
.addToUi();
}
function appendValuestoSheet(){
var ss = SpreadsheetApp.getActiveSpreadsheet(); // get the current open sheet
var fontWeights = []; // empty array to be filled with formatting strings (Its size will be based on the newData array size
var newData = [
["Place1", "Service1", "Service2"],
["Place1", "Service1", "Service2"]
];
// iterate the new values to add to sheet
newData.forEach(function(row,rowIndex){
var newFontWeightsRow, fontWeight;
// Set bold format only to the first row
if(rowIndex === 0){
fontWeight = "bold";
} else {
fontWeight = "normal";
}
// buids a new row with the formats, in this case only the first row will be bold;
newFontWeightsRow = row.map(function(){return fontWeight});
// push the new formats row to the array;
fontWeights.push(newFontWeightsRow);
});
// "fontWeights" array has the same size as "newData" array
ss.getSheetByName("newDataTab")
.getRange(1, 1, newData.length, newData[0].length) // adds data starting on the first row and col;
.setFontWeights(fontWeights) // sets the new formats to the range
.setValues(newData); // sets the new data to the range
}
所以...我构建了一个自定义函数,可以在单个单元格中处理来自 Gsheet 和 return 的值。简而言之,来源 sheet 一栏包含地点,一栏包含在这些地点提供的服务,另一栏包含结束日期。自定义函数收集在确定的日期在同一地点提供的所有服务。它已经在工作并且几乎给了我预期的 return.
返回的字符串:
-> 地点 1:
- 服务 1;
- 服务 2.
-> 地方 2:
- 服务 3;
- 服务 4。
想要return:
-> 地点 1:
- 服务 1;
- 服务 2.
-> 地点 2:
- 服务 3;
- 服务 4.
我已经搜索过RichTextValue的用法,不知道是因为我是作为自定义函数的return使用的还是我不知道怎么用它正确,但它不工作。这是我用来测试函数的示例代码:
function test(){
var bold=SpreadsheetApp.newTextStyle().setBold(true).build();
var test=SpreadsheetApp.newRichTextValue().setText("test").setTextStyle(0,2,bold).build().getText();
return test;
}
这很明显,有人会说 "getText()" return 是包含在 RichTextValue 中的字符串,所以它不会 return RichText,我知道。所以我在 "build()" 之后尝试了 "getRuns().join()" (加入是因为 getRuns returns 数组),我得到了这个结果: "com.google.apps.maestro.server.beans.trix.impl.RichTextValueApiAdapter@2d54d6e,com.google.apps.maestro.server.beans.trix.impl.RichTextValueApiAdapter@4c67374a".
所以 我的问题 是,是否有 "getRichText()" 作为我的自定义函数的 return 或任何其他方式来做到这一点?
提前致谢。
实际上不可能return自定义函数的格式化数据,只能是原始值。
您可以使用条件格式或制作自定义菜单或按钮,这样您就可以 运行 构建值及其格式的函数。 像这样:
// on its startup (Simple trigger) it runs the onOpen function that creates a custom menu and adds a menu item that when clicked runs the function "appendValuestoSheet"
function onOpen(){
SpreadsheetApp.getUi()
.createMenu("My Custom Menu")
.addItem("Calculate Values", "appendValuestoSheet")
.addToUi();
}
function appendValuestoSheet(){
var ss = SpreadsheetApp.getActiveSpreadsheet(); // get the current open sheet
var fontWeights = []; // empty array to be filled with formatting strings (Its size will be based on the newData array size
var newData = [
["Place1", "Service1", "Service2"],
["Place1", "Service1", "Service2"]
];
// iterate the new values to add to sheet
newData.forEach(function(row,rowIndex){
var newFontWeightsRow, fontWeight;
// Set bold format only to the first row
if(rowIndex === 0){
fontWeight = "bold";
} else {
fontWeight = "normal";
}
// buids a new row with the formats, in this case only the first row will be bold;
newFontWeightsRow = row.map(function(){return fontWeight});
// push the new formats row to the array;
fontWeights.push(newFontWeightsRow);
});
// "fontWeights" array has the same size as "newData" array
ss.getSheetByName("newDataTab")
.getRange(1, 1, newData.length, newData[0].length) // adds data starting on the first row and col;
.setFontWeights(fontWeights) // sets the new formats to the range
.setValues(newData); // sets the new data to the range
}