Определение целого столбца в спецификации диапазона API

#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 нет, это означает, что то, что вы хотите, в настоящее время невозможно. Если вы укажете диапазон, превышающий текущую конфигурацию листа, будет использоваться текущая конфигурация. Решение заключается в периодическом обновлении вашего форматирования