我一直在为我的一个小项目挣扎一段时间,并且正在寻找一些帮助。我认为关键问题是我不熟悉数组脚本语言以及如何处理这个问题。在对此进行了一些研究并阅读了最佳实践部分后,我尝试了一些方法,但未能使其充分发挥作用。
我的脚本需要能够从电子表格中收集200行x 200列数据,并且根据每个单元格中的数字,它需要选择该数字旁边的相应列数并为其着色。< / p>
这对我的基本编程知识非常简单,只需要选择每个单元格,检查数字,选择带偏移的范围,然后更改颜色并移动到下一个单元格,但是我的代码是非常慢,因为它在没有批量处理数据的情况下完成工作表中的所有内容,并且无法在Google Script的时间限额内完成全部范围。任何加速它的帮助都将非常感激,因为我无法使用数组工作。
这是我目前正在使用的代码:
function CreateCalendar() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName('Sheet2');
var selection=ss.getRange("Sheet2!H2:FC140");
var columns=selection.getNumColumns();
var rows=selection.getNumRows();
for (var column=1; column < columns; column++) {
for (var row=1; row < rows; row++) {
var cell=selection.getCell(row,column);
var cellvalue=cell.getValue();
if (cellvalue >= 1) {
var range=cell.offset(0,0,1,cellvalue);
range.setBackground("blue");
}
else {;}
}
}
}
这是一个删除了机密信息的公开电子表格,我要定位的工作表是Sheet2。我能得到的任何帮助将不胜感激!感谢
https://docs.google.com/spreadsheets/d/1Oe0aacfSBMmHpZvGPmjay5Q1bqBebnGQV4xlsK8juxk/edit#gid=0
答案 0 :(得分:1)
你需要摆脱对range.getValue()的重复调用。您可以在一个电话和一个电话中获得该范围的所有值。然后在脚本中迭代该数组。
对于你的脚本,它看起来像这样:
function CreateCalendar() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName('Sheet2');
var selection=ss.getRange("Sheet2!H1:FC140"); // <= include header, but we'll skip it when we get to stepping over the array
var values = selection.getValues(); // <= get all of the values now in one call
for (var r=1; r < values.length; r++) {
for (var c=0; c < values[r].length; c++) {
if (values[r][c] >= 1) {
var range=sheet.getRange(r+1, c+8, 1, values[r][c]); // r+1 & c+8 because of array offsets
range.setBackground("blue");
}
else {;}
}
}
}
查看Google的文档:range.GetValues()https://developers.google.com/apps-script/reference/spreadsheet/range#getValues()
答案 1 :(得分:0)
以下示例脚本怎么样?如果这不是您的期望,我想修改此脚本。
示例脚本:
function CreateCalendar() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName('Sheet2');
var data = sheet.getRange("H2:FC140").getValues();
data.forEach(function(e1, i1){
e1.forEach(function(e2, i2){
if (e2 >= 1) {
sheet.getRange(i1+2, i2+8).offset(0,0,1,e2).setBackground("blue");
}
})
})
}
结果(样本):
如果我误解了你的问题,我很抱歉。