如何更改Google表格脚本中的设置范围,以便可以在单元格中选择它?

时间:2019-01-18 20:07:29

标签: javascript google-apps-script google-sheets

首先,我根本不是编码人员,只是一位在谷歌搜索中使生活变得更加轻松的老师。在我的出勤书中,我加粗了一个学生迟到的时间(为了计算出勤率,他们会得到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 :(得分:0)

现有脚本中的

range_input是硬编码的。这是不令人满意的,因为它不允许在逐个学生的基础上进行分析。要解决此问题,您需要遍历每个学生的数据,并对每个学生进行“粗体显示”。

让我们假设“ C3:S3”是单个学生的范围。我们还假设其他学生的数据包含在随后的每一行中,并且有两个标题行。

要做的事情

  • 计算出学生数据的行数-引用变量ALast
  • 一次性获取所有学生的数据。为什么?因为这比一次将数据获取一行更有效,所以请参考下面讨论的range_input
  • 遍历数据的每一行(即按学生循环-使用“ for”循环)。
  • 使用大多数现有代码,对粗体单元格进行计数并为每个学生更新结果;

注意:
使用range_output(行,列)为每一行计算目标范围(getRange。可以通过将值保存到数组中,并在单个过程中更新所有值来完成此操作,但是我最好保留OP所采用的方法,而不要使事情复杂化。如果有很多学生并且代码花费的时间太长,那么按数组更新计数将更加有效。

使用range_input(行,列,numRows,numColumns)定义输入范围(getRange)。

  • row = 3,第一行数据
  • 列= 3,C列
  • numRows =计算值(至少减去两个标题行)
  • 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    
  }
}