首页 > 解决方案 > 如何更改谷歌表格脚本中的设置范围,以便可以在单元格中选择它?

问题描述

首先,我根本不是编码员,只是一名擅长用谷歌搜索让生活更轻松的老师。在我的考勤簿中,我将学生迟到的时间加粗(如果在场,则为 1,如果不在,则为 0,以计算出勤率)。

我发现了一个很棒的脚本,可以让我计算一个范围内粗体项目的数量。但是,范围已设置,我无法根据需要在谷歌表格中为每个学生指定新范围。

我尝试将其更改为“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); 
      }

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


range_input在现有脚本中是硬编码的。这是不能令人满意的,因为它不允许在逐个学生的基础上进行分析。要解决此问题,您需要遍历每个学生的数据,并为每个学生执行“countbold”。

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

去做:

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

注意:使用(row,column)为每一行计算
目标范围 ( )。这可以通过将值保存到数组并在单个进程中更新所有值来完成,但我认为最好保留 OP 已经采用的方法,而不是使事情过于复杂。如果有很多学生并且代码运行时间过长,那么按数组更新计数会更有效。range_outputgetRange

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

  • row = 3,第一行数据
  • 列 = 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    
  }
}

推荐阅读