Как я могу найти наименьшее число в диапазоне и увеличить это число на 1 в таблицах Google?

#javascript #google-apps-script #google-sheets #google-sheets-api

#javascript #google-apps-script #google-sheets #google-sheets-api

Вопрос:

В предисловии к этому, у меня нет опыта программирования, но я работал над созданием отслеживания инициатив для Dungeons and Dragons 5e в таблицах Google.

Что я хотел бы сделать, так это иметь макрос, который делает это за меня: когда я активирую его, он будет искать диапазон (в данном случае столбец C), находить ячейку с наименьшим числовым значением и добавлять к ней 1.

Буду признателен за любую помощь!

Ответ №1:

Объяснение:

Эту задачу можно разбить на две разные подзадачи:

  1. Вам нужно взаимодействовать с файлом электронной таблицы, чтобы получить значения столбца C. Следующий код получает из листа 1 значения столбца C, начиная со второй строки и до последней строки с содержимым:

     const ss = SpreadsheetApp.getActive();
    const sh = ss.getSheetByName('Sheet1');
    const cVals = sh.getRange('C2:C' sh.getLastRow()).getValues().flat(1);
      

cVals это список всех значений C в Sheet1. Чтобы найти запись с минимальным значением, вы используете метод reduce():

 const indexMin = cVals.reduce((min_i, x, i, ar) => x < ar[min_i] ? i : min_i, 0);
  

Это дает позицию элемента в indexMin , который имеет наименьшее значение, начиная с 0 . Однако cVals имеет список значений C, начинающихся с C2 . Вот почему мы добавляем 2 , чтобы найти row number на листе, где столбец C имеет наименьшее значение, а затем мы добавляем 1 к старому значению:

 sh.getRange(indexMin 2,3).setValue(sh.getRange(indexMin 2,3).getValue() 1)
  
  1. Наконец, вы хотите иметь возможность выполнять эту функцию из файла электронной таблицы. Чтобы достичь этого, вы можете создать пользовательское меню (макрос), используя следующий код:

     function onOpen() {
       SpreadsheetApp.getUi()
       .createMenu('Macros')
       .addItem('Add one to C minimum', 'plusOne')
       .addToUi();
    }
      

Полное решение:

   function onOpen() {
    SpreadsheetApp.getUi()
    .createMenu('Macros')
    .addItem('Add one to C minimum', 'plusOne')
    .addToUi();
  }

  function plusOne() {
  
    const ss = SpreadsheetApp.getActive();
    const sh = ss.getSheetByName('Sheet1');
    const last_row = sh.getLastRow();
    const num_rows = sh.getRange('C:C').getValues().filter(String).length;
    const num_blank = last_row-num_rows;
      
    const cVals = sh.getRange('C2:C' last_row).getValues().flat(1);
    const indexMin = cVals.reduce((min_i, x, i, ar) => x < ar[min_i] ? i : min_i, 0);
 sh.getRange(indexMin 2 num_blank,3).setValue(sh.getRange(indexMin 2 num_blank,3).getValue() 1)
}
  

Результаты / Инструкции:

  1. Нажмите на Инструменты => Редактор сценариев.
  2. Скопируйте / вставьте полный код в пустой скрипт.
  3. Обновите таблицу, и новый макрос будет создан в виде боковой панели.
  4. Затем вы можете щелкнуть по нему, чтобы выполнить задачу.

Результаты


Предположения:

  1. Столбец C имеет заголовок.
  2. Имя листа — Sheet1. Вы можете настроить это из кода.
  3. Если есть два минимума (наименьшее значение отображается дважды), то оно увеличит на 1 только ячейку, которая принадлежит верхней строке.

Ссылки:

Скрипт приложений Google:

Библиотеки JavaScript:

Комментарии:

1. Это здорово, но есть ли какой-либо способ добавить его только к ячейкам, в которых уже есть число? проблема, с которой я сталкиваюсь, заключается в том, что он просто добавляет 1 к списку пустых ячеек ниже, который я пытаюсь изменить.

2. @AndrewPingry пожалуйста, ознакомьтесь с моим обновленным решением. Теперь, если между данными есть пустые ячейки, он все равно будет работать правильно.