Как изменить диапазон набора в скрипте листов Google, чтобы его можно было выбрать в ячейке? - PullRequest
0 голосов
/ 18 января 2019

Во-первых, я вообще не кодер, я просто учитель, который умеет искать вещи, чтобы облегчить жизнь. В моей книге посещаемости я выделил время, когда студент опаздывает (они получают 1, если присутствует, и 0, если отсутствует, чтобы рассчитать коэффициент посещаемости).

Я нашел потрясающий скрипт, который позволяет мне подсчитывать количество жирных элементов в диапазоне. Однако диапазон установлен, и я не могу указать новый диапазон в листах Google для каждого учащегося, если это необходимо.

Я попытался изменить его на «function countColoredCells (countRange)», но он не работает, так как я предполагаю, что есть что-то еще, что я должен сделать в оставшейся части скрипта.

У меня практически нет знаний о кодировании, и я бы действительно оценил бы любую помощь, чтобы решить эту проблему!

    function countboldcells() {
      var book = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = book.getActiveSheet();
      var range_input = sheet.getRange("C3:S3"); 
      var range_output = sheet.getRange("N3");
      var cell_styles = range_input.getFontWeights(); 
      var count = 0;

      for(var r = 0; r < cell_styles.length; r++) {
        for(var c = 0; c < cell_styles[0].length; c++) { 
          if(cell_styles[r][c] === "bold") { 
           count = count + 1; 
            }
          }
        }
        range_output.setValue(count); 
      }

1 Ответ

0 голосов
/ 20 января 2019

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    
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...