range_input
в существующем скрипте жестко запрограммирован.Это неудовлетворительно, потому что не позволяет проводить анализ для каждого учащегося.Чтобы это исправить, вам нужно просмотреть данные для каждого учащегося и выполнить «countbold» для каждого учащегося.
Предположим, что «C3: S3» - это диапазон для одного учащегося.Давайте также предположим, что данные для других учащихся содержатся в каждой последующей строке, и что есть две строки заголовка.
Для этого:
- Определить количество строк данных студента - см. Переменную
ALast
. - Получите данные для всех студентов за один раз.Зачем?Потому что это более эффективно, чем получать данные по одной строке за раз - см.
range_input
, обсуждаемый ниже. - Цикл по каждой строке данных (т. Е. Цикл по ученику - используя цикл «для»).
- Подсчитайте жирные ячейки и обновите результаты для каждого учащегося - используя большую часть существующего кода;
Примечание:
Целевой диапазон (range_output
) рассчитывается для каждой строки с использованием getRange
(строка, столбец).Это можно было бы сделать, сохранив значения в массиве и обновив все значения в одном процессе, но я подумал, что было бы лучше сохранить подход, уже использованный OP, и не усложнять ситуацию.Если есть много студентов, и выполнение кода занимает слишком много времени, то обновление счетчиков по массиву будет более эффективным.
Диапазон ввода (range_input
) определяется с помощью getRange
(строка, столбец, numRows, numColumns).
- строка = 3, первая строка данных
- column = 3, столбец C
- numRows = вычисленное значение (ALast минус две строки заголовка)
- numColumns = столбцы от C до S включительно = 17 (назначены переменной).
function so54260768() {
// Setup spreadsheet and target sheet
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet = book.getActiveSheet();
// get the number of students in Column A
var Avals = book.getRange("A1:A").getValues(); // assuming rows one and two are headers
var Alast = Avals.filter(String).length;
//Logger.log("DEBUG: The last row on A = " + Alast);// DEBUG
// number of columns in the data range
var NumberofColumns = 17;
// get the data for all students
var range_input = sheet.getRange(3, 3, Alast - 2, NumberofColumns); // the first two rows are headers
var cell_styles = range_input.getFontWeights();
// start loop though each row - one row per student
for (z = 0; z < Alast - 2; z++) {
// set the bold counter to zero
var count = 0;
//loop through the cells in this row; count the cells that are bold
for (var i = 0; i < NumberofColumns; i++) {
if (cell_styles[z][i] === "bold") {
count = count + 1;
}
}
//Logger.log("DEBUG: row="+(z+3)+", count="+count);//DEBUG
var range_output = sheet.getRange(z + 3, 14).setValue(count); //. row, column
}
}