在同一电子表格的不同工作表上,我有两个大小相等的范围。我试图在第一张纸中找到一行(基于用户输入),然后使用该索引来修改第二张纸中的表,该表计算该索引之前已被使用了多少次(以制作出美观的饼图)图表)。
此代码运行,但不会在第二张纸上产生结果。我已经完成了调试过程,而我最好的猜测是由于某种原因,我的for in循环未通过。随附的代码包含了前面提到的索引,并试图实现目标的后半部分。
function acceptToEncounterChart(ghostrow) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(ss.getSheets()[1]);
ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Average Encounter Chart");
var range = sheet.getRange("B3:B14")
for(var i in range) {
if(ghostrow == i) {
var before = range[i][0].getValue()
range[i][0].setValue(before + 1);
}
}
SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);
};
答案 0 :(得分:1)
我不确定您的目标是什么。
但是,从头开始有一些修复/改进:
您定义的变量ss
的2倍具有完全相同的值。
如果您的目标只是获取工作表,则无需设置活动工作表,因此此行是多余的:
SpreadsheetApp.setActiveSheet(ss.getSheets()[1]);
变量range
不是数组,而是range对象。您无法为其建立索引,因此您也不能也使用for循环迭代单个对象。出于相同的确切原因,如果if语句中的代码错误,则不能索引range
。但是您不会看到任何错误,因为if
语句的计算结果为false
。
在JavaScript和许多其他编程语言中,数组索引从0
开始。由于您的范围从单元格B3
或行3
开始,因此您需要使用i+3
将数据与范围匹配。
出于与上一点相同的原因,ghostrow
是索引,而不是行。 if
语句将数组索引i
与ghostrow
进行比较,因此不应将ghostrow
与实际的工作表行混淆。例如,如果您选择ghostrow=5
,则当前脚本将使单元格B8
(记住i+3
)的值增加1。
以下是可行的代码段:
function acceptToEncounterChart(ghostrow) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Average Encounter Chart");
var data = sheet.getRange("B3:B14").getValues().flat();
data.forEach((v,i)=>{
if(ghostrow == i){
sheet.getRange(i+3,2).setValue(v+1)
}
});
ss.setActiveSheet(ss.getSheets()[0]);
}