我正在尝试将自定义功能从excel VBA转换为App Scrip。
Public Function Objective(sv As Variant, y As Variant, x As Variant) As Variant
sum1 = 0
sum2 = 0
For i = 1 To 15
For j = 1 To 15
sum2 = sum2 + sv(i) * sv(j) * y(i) * y(j) * (x(i, 1) * x(j, 1) + x(i, 2) * x(j, 2) + x(i, 3) * x(j, 3))
Next j
sum1 = sum1 + sv(i)
Next i
Objective = sum1 - 0.5 * sum2
End Function
这是我作为Google App脚本的脚本
function OBJECTIVE(sv, y, x) {
var sum1=0;
var sum2=0;
for(var i=0; i<15; i++){
for(var j=0; j<15; j++){
sum2=sum2+sv[i]*sv[j]*y[i]*y[j]*(x[i][1]*x[j][1]+x[i][2]*x[j][2]+x[i][3]*x[j][3]);
}
sum1=sum1+sv[i];
}
objective=sum1-0.5*sum2;
}
但是我在sum2=sum2+sv[i]*sv[j]*y[i]*y[j]*(x[i][1]*x[j][1]+x[i][2]*x[j][2]+x[i][3]*x[j][3]);
这行上说TypeError: Cannot read property "0" from undefined. (line 7, file "Code")
时出错。我没有看到语法上的任何问题,可能是什么原因?
答案 0 :(得分:0)
我知道这不是您问题的答案,但我认为它可以帮助您充分了解Apps Script数组,以便您可以找出其余的内容。只需复制它即可根据需要更改工作表名称。它将识别出三个范围并将它们的索引放在每个单元格中。
function playingWithArrays(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('SHEETNAME');
sh.clear();
var rg1=sh.getRange('A2:C16');
rg1.setBackground('lightyellow');
var rg2=sh.getRange('D2:D16');
rg2.setBackground('lightblue');
var rg3=sh.getRange('F2:F16');
rg3.setBackground('lightgreen');
var vA=rg1.getValues();
var vB=rg2.getValues();
var vC=rg3.getValues();
for(var i=0;i<vA.length;i++){
for(var j=0;j<rg1.getWidth();j++){
vA[i][j]=Utilities.formatString('[%s][%s]',i,j);
}
}
for(var i=0;i<vB.length;i++){
for(var j=0;j<rg2.getWidth();j++){
vB[i][j]=Utilities.formatString('[%s][%s]',i,j);
}
}
for(var i=0;i<vC.length;i++){
for(var j=0;j<rg2.getWidth();j++){
vC[i][j]=Utilities.formatString('[%s][%s]',i,j);
}
}
sh.getRange('A1').setValue(rg1.getA1Notation());
rg1.setValues(vA);
sh.getRange('D1').setValue(rg2.getA1Notation());
rg2.setValues(vB);
sh.getRange('F1').setValue(rg3.getA1Notation());
rg3.setValues(vC);
}
别忘了单元格函数必须返回一个值。像return sum;