#google-apps-script #google-sheets-api
#google-apps-script #google-sheets-api
Вопрос:
Я могу использовать приведенный ниже синтаксис для ссылки на весь столбец A, B и C:
A1:C
Приведенный ниже скрипт будет ссылаться на полные доступные ячейки!
var myRange = {
'sheetId': sheet.getSheetId(),
'startRowIndex': 0,
'endRowIndex': sheet.getLastRow(),
'startColumnIndex': 0,
'endColumnIndex': sheet.getLastColumn()
}
Если пользователь вставит новую строку, этот диапазон не будет охватывать ее. Как изменить его, чтобы поддерживать весь столбец так же, как A1:C
?
Полный сценарий, как показано ниже:
function addConditonalFormat() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet = ss.getActiveSheet()
sheet.clearConditionalFormatRules()
var colorMerged = {'red': 222/255, 'green': 235/255, 'blue': 246/255, 'alpha': 0.7}
var colorSkipped = {'red': 222/255, 'green': 235/255, 'blue': 0, 'alpha': 0.7}
var myRange = {
'sheetId': sheet.getSheetId(),
'startRowIndex': 0,
'endRowIndex': sheet.getLastRow(),
'startColumnIndex': 0,
'endColumnIndex': sheet.getLastColumn()
}
var config = [["merged",colorMerged],["skipped",colorSkipped]]
var requests = []
for (var i=0;i<config.length;i ) {
var row = config[i]
var keyword = row[0]
var color = row[1]
Logger.log(keyword ":" color)
var cond = {'addConditionalFormatRule': {
'index': 0,
'rule': {
'ranges': [ myRange ],
'booleanRule': {
'format': {'backgroundColor': color},
'condition': {
'type': 'CUSTOM_FORMULA',
'values':[{'userEnteredValue': '=$A:$A="' keyword '"'}]},},},} }
requests.push(cond)
}
var format_req = {
'requests': requests,
'includeSpreadsheetInResponse': false,
}
Sheets.Spreadsheets.batchUpdate(JSON.stringify(format_req), ss.getId())
}
После запуска скрипта, а затем вставки строк после последней строки, условный формат не будет применяться к новым добавленным строкам!
Комментарии:
1. Могу ли я спросить вас об этом, чтобы правильно понять вашу ситуацию? 1. О
user insert a new line
том, пользователь помещает значение в строки ниже текущей последней строки? Или пользователь вставляет новые строки в лист? 2. Оthis range will not cover it
том, как пользователь вставляет или вставляет? 3.getLastRow()
иgetLastColumn()
извлеките текущую последнюю строку и последний столбец, который имеет значение, соответственно. Хотя я не уверен в вашем скрипте в целом, например, какой результат вы получите, когдаSpreadsheetApp.flush()
ставится передvar myRange = {}
?2. @Tanaike Спасибо, да, я имею в виду, что пользователь добавляет новые строки после последней строки. обновлен полный сценарий и образцы данных / выходных данных. Мне не нужно вызывать flush, поскольку ввод данных осуществляется пользователем.
3. Спасибо за обновление. Я мог бы понять вашу ситуацию. Я заметил, что ответ уже был опубликован. Это решит вашу проблему. Если вы хотите исправить последний столбец на столбец «C», пожалуйста, удалите только
'endRowIndex': sheet.getLastRow()
.
Ответ №1:
Просто: чтобы ссылаться на весь лист целиком, не указывайте никаких спецификаций индекса. Согласно DimensionRange
GridRange
документации и, отсутствующие индексы указывают на неограниченную спецификацию.
const theWholeSheet = {
sheetId: sheet.getSheetId()
};
const noFirstRowOrFirstCol = {
sheetId: sheet.getSheetId(),
startColumnIndex: 1,
startRowIndex: 1
};
Комментарии:
1. Спасибо, после удаления строк и применения моей функции, затем проверьте ее в пользовательском интерфейсе conditonal format, там написано «A1: CW1001», я бы хотел, чтобы это было «A1: CW».
2. @lucky если вы вручную установите это в конфигурации пользовательского интерфейса в условном формате, останется ли оно? Или он также преобразуется при сохранении и повторном открытии документа?
3. Точно, даже если я изменил его на «A1: CW» в пользовательском интерфейсе, но если я снова открою его, он изменится на «A1: CW1001». Означает ли это, что он обрабатывает только 1001 строку как самый большой диапазон?
4. @lucky нет, это означает, что то, что вы хотите, в настоящее время невозможно. Если вы укажете диапазон, превышающий текущую конфигурацию листа, будет использоваться текущая конфигурация. Решение заключается в периодическом обновлении вашего форматирования