#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:
Объяснение:
Эту задачу можно разбить на две разные подзадачи:
-
Вам нужно взаимодействовать с файлом электронной таблицы, чтобы получить значения столбца 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)
-
Наконец, вы хотите иметь возможность выполнять эту функцию из файла электронной таблицы. Чтобы достичь этого, вы можете создать пользовательское меню (макрос), используя следующий код:
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)
}
Результаты / Инструкции:
- Нажмите на Инструменты => Редактор сценариев.
- Скопируйте / вставьте полный код в пустой скрипт.
- Обновите таблицу, и новый макрос будет создан в виде боковой панели.
- Затем вы можете щелкнуть по нему, чтобы выполнить задачу.
Предположения:
- Столбец C имеет заголовок.
- Имя листа — Sheet1. Вы можете настроить это из кода.
- Если есть два минимума (наименьшее значение отображается дважды), то оно увеличит на 1 только ячейку, которая принадлежит верхней строке.
Ссылки:
Скрипт приложений Google:
Библиотеки JavaScript:
Комментарии:
1. Это здорово, но есть ли какой-либо способ добавить его только к ячейкам, в которых уже есть число? проблема, с которой я сталкиваюсь, заключается в том, что он просто добавляет 1 к списку пустых ячеек ниже, который я пытаюсь изменить.
2. @AndrewPingry пожалуйста, ознакомьтесь с моим обновленным решением. Теперь, если между данными есть пустые ячейки, он все равно будет работать правильно.