javascript - 如何更改谷歌表格脚本中的设置范围,以便可以在单元格中选择它?
问题描述
首先,我根本不是编码员,只是一名擅长用谷歌搜索让生活更轻松的老师。在我的考勤簿中,我将学生迟到的时间加粗(如果在场,则为 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);
}
解决方案
range_input
在现有脚本中是硬编码的。这是不能令人满意的,因为它不允许在逐个学生的基础上进行分析。要解决此问题,您需要遍历每个学生的数据,并为每个学生执行“countbold”。
假设“C3:S3”是单个学生的范围。我们还假设其他学生的数据包含在每个后续行中,并且有两个标题行。
去做:
- 计算出学生数据的行数 - 参考变量
ALast
。 - 一口气获取所有学生的数据。为什么?因为这比一次获取一行数据更有效 - 请参阅
range_input
下面讨论的内容。 - 循环遍历数据的每一行(即按学生循环 - 使用“for”循环)。
- 计算粗体单元格并更新每个学生的结果 - 使用您现有的大部分代码;
注意:使用(row,column)为每一行计算
目标范围 ( )。这可以通过将值保存到数组并在单个进程中更新所有值来完成,但我认为最好保留 OP 已经采用的方法,而不是使事情过于复杂。如果有很多学生并且代码运行时间过长,那么按数组更新计数会更有效。range_output
getRange
输入范围 ( 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
}
}
推荐阅读
- node.js - 如何在 CentOS 上使用 Nginx 反向代理到域子文件夹中的 Node.js 应用程序?
- angular - 在 application.yml 中获取打包在 Jar 中的文件夹的 dir 路径
- android - Unity 2019.3.0f6 Gradle 构建失败
- c# - Azure 函数 blobtrigger 不应在子文件夹上触发
- c# - 如何在 c# wpf 中不关闭窗口
- assembly - 如何在链接阶段获取与标签关联的地址?
- python-3.x - 哪种人脸检测方法适合远距离检测人脸?
- angular - 如何将一个角度组件的预览显示到另一个组件中?
- mysql - 设置可以通过 http 访问的数据库
- javascript - Uncaught ReferenceError: check is not defined at onchange