Кто-нибудь знает, как подчеркнуть часть текста в ячейке Google Sheets? Я действительно ищу функцию, подобную моему заголовку, для этого запроса.
Я играл с .getDisplayValue, .getValue для класса Range и безуспешно пытался проверить, доступен ли класс текста документа из листов Google. Я знаю, что могу сделать это прямо из Google Таблиц, но мне нужна эта возможность из Google Apps Scripts (GAS).
Я также знаю, что эта возможность в реальном редакторе электронных таблиц является новой, и, возможно, скрипту приложений необходимо наверстать упущенное.
Спасибо за любые ответы.
Терри





Попробуйте использовать приведенную ниже функцию для подчеркивания вашей строки. К сожалению, Google Таблицы не поддерживают непрерывное подчеркивание.
function underline(string, start, end) {
start = start || 0;
end = end || string.length;
var res = "";
for (var i=start; i < end; i++) {
res += string.charAt(i) + "\u0332";
}
return res.toString();
}
Я включил эту функцию в свой сценарий, однако заметил, что если она написана заглавными буквами, подчеркивание становится прерывистым под каждой буквой. Также, если есть пробел, подчеркивание немного опускается ниже, чем остальное подчеркивание. Есть ли способ предотвратить это?
См. https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#CellData и https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#TextFormatRun, чтобы узнать, как это сделать.
См. https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#RepeatCellRequest, чтобы узнать, как применить форматирование к нескольким ячейкам одновременно, если вам это нужно.
Я лично не пробовал возможности TextFormatRun, но в качестве более общего примера вот как вы меняете цвет фона и переднего плана, выравнивание и жирность строки:
def sheets_batch_update(SHEET_ID,data):
print ( ("Sheets: Batch update"))
service.spreadsheets().batchUpdate(spreadsheetId=SHEET_ID,body=data).execute() #,valueInputOption='RAW'
data = {
"requests": [
#format header row
{
"repeatCell": {
"range": {
"sheetId": all_sheets['Users'],
"startRowIndex": 0,
"endRowIndex": 1
# "startColumnIndex": 0,
# "endColumnIndex": 6
},
"cell": {
"userEnteredFormat": {
"backgroundColor": {
"red": 0.4,
"green": 0.4,
"blue": 0.4
},
"horizontalAlignment" : "LEFT",
"textFormat": {
"foregroundColor": {
"red": 1.0,
"green": 1.0,
"blue": 1.0
},
#"fontSize": 12,
"bold": True
}
}
},
"fields": "userEnteredFormat(backgroundColor,textFormat,horizontalAlignment)"
}
},
]
}
sheets_batch_update(SHEET_ID, data)
Я написал пример с использованием TextFormatRun здесь: stackoverflow.com/a/49289754/9337071
Теперь вы можете установить Underlines в GAS.
function underline(startOffset,endOffset){
startOffset = startOffset || 1;
endOffset = endOffset || 3;
var rng = SpreadsheetApp.getActiveSheet().getRange("A1");
var val = rng.getValue().toString();
var rich = SpreadsheetApp.newRichTextValue(); //new RichText
rich.setText(val); //Set Text value in A1 to RichText
var style = SpreadsheetApp.newTextStyle(); // Create a new text style
style.setUnderline(true);
var buildStyle = style.build();
rich.setTextStyle(startOffset,endOffset,buildStyle); // set this text style to the offset character range and save it to Rich text
var format = rich.build()
rng.setRichTextValue(format); //Set the final RichTextValue back to A1
}
Я думаю, что ваш ответ - хорошее решение. Я хотел бы проголосовать за этот ответ. Из вашего сценария я подумал, что когда
return string.slice(0, start) + res.toString() + string.slice(end);используется в качестве возвращаемого значения,=underline("abcdefg", 2, 5)покажетabc̲d̲e̲fg. Если это не помогло, проигнорируйте.