javascript谷歌脚本2d数组:组合相似值
在google电子表格中,我使用javascript创建了一个嵌套的2D数组 “工时”表是员工为不同类别添加不同工时的表。 这里有一个带有submit()函数触发器的图像。 “批准”表从“工时”表中接收一些数据,经理可以在其中批准 以下是脚本:javascript谷歌脚本2d数组:组合相似值,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,在google电子表格中,我使用javascript创建了一个嵌套的2D数组 “工时”表是员工为不同类别添加不同工时的表。 这里有一个带有submit()函数触发器的图像。 “批准”表从“工时”表中接收一些数据,经理可以在其中批准 以下是脚本: function cleanArray(actual){ var newArray = new Array(); for(var i = 0; i<actual.length; i++){ if(actual[i] != "") {
function cleanArray(actual){
var newArray = new Array();
for(var i = 0; i<actual.length; i++){
if(actual[i] != "") {
newArray.push(actual[i]);
};
};
return newArray;
}
function addArray(array){
var sum = 0;
for(var i=0; i<array.length; i++) {
sum += Number(array[i]);
};
return sum;
}
function createArray(cats, hours) {
var newArray = new Array();
for (i in hours) {
if(hours[i] != "" ) {
if(cats[i] == '') { cats[i] = "Unclaimed" };
newArray[i] = new Array(cats[i], hours[i]);
};
};
return newArray;
}
function submit() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Hours');
var employee = sheet.getRange('B1').getValue();
var startDate = sheet.getRange('C2').getValue();
var mondayHours = sheet.getRange('B4:B9').getValues();
var mondayCats = sheet.getRange('D4:D9').getValues();
var mondayArray = createArray(mondayCats, mondayHours);
var mondayTtl = addArray(mondayHours);
var tuesdayHours = sheet.getRange('B11:B16').getValues();
var tuesdayCats = sheet.getRange('D11:D16').getValues();
var tuesdayArray = createArray(tuesdayCats, tuesdayHours);
var tuesdayTtl = addArray(tuesdayHours);
var wednesdayHours = sheet.getRange('B18:B23').getValues();
var wednesdayCats = sheet.getRange('D18:D23').getValues();
var wednesdayArray = createArray(wednesdayCats, wednesdayHours);
var wednesdayTtl = addArray(wednesdayHours);
var thursdayHours = sheet.getRange('B25:B30').getValues();
var thursdayCats = sheet.getRange('D25:D30').getValues();
var thursdayArray = createArray(thursdayCats, thursdayHours);
var thursdayTtl = addArray(thursdayHours);
var fridayHours = sheet.getRange('B32:B37').getValues();
var fridayCats = sheet.getRange('D32:D37').getValues();
var fridayArray = createArray(fridayCats, fridayHours);
var fridayTtl = addArray(fridayHours);
var saturdayHours = sheet.getRange('B39:B44').getValues();
var saturdayCats = sheet.getRange('D39:D44').getValues();
var saturdayArray = createArray(saturdayCats, saturdayHours);
var saturdayTtl = addArray(saturdayHours);
var sundayHours = sheet.getRange('B46:B51').getValues();
var sundayCats = sheet.getRange('D46:D61').getValues();
var sundayArray = createArray(sundayCats, sundayHours);
var sundayTtl = addArray(sundayHours);
var weekArray = new Array();
for (i in mondayArray){
weekArray.push(mondayArray[i]);
};
for (i in tuesdayArray){
weekArray.push(tuesdayArray[i]);
};
for (i in wednesdayArray){
weekArray.push(wednesdayArray[i]);
};
for (i in thursdayArray){
weekArray.push(thursdayArray[i]);
};
for (i in fridayArray){
weekArray.push(fridayArray[i]);
};
for (i in saturdayArray){
weekArray.push(saturdayArray[i]);
};
for (i in sundayArray){
weekArray.push(sundayArray[i]);
};
var weekHours = new Array(mondayTtl, tuesdayTtl, wednesdayTtl, thursdayTtl, fridayTtl, saturdayTtl, sundayTtl);
var weekHoursTtl = addArray(weekHours); //CAPTURE
var sortWeekArray = ArrayLib.sort(weekArray, 0, true)
var approve = SpreadsheetApp.getActive().getSheetByName('Approve');
approve.getRange('D1').setValue(sortWeekArray);
}
我想合并col1中的like项,并对col2中的like值求和,我想在输出结果之前在javascript中这样做
因此,样本输出将变成:
ESL | 2
-------------------------
Parent Engagement | 8
-------------------------
School Liaison | 16.25
-------------------------
Tutoring | 11.75
-------------------------
Unclaimed | 2.5
-------------------------
Volunteer Svcs | 2
有什么想法吗?我已经在使用了,但这些函数似乎都不符合要求
weekArray看起来像:{“category”,val;“category”,val;…}
此外,任何关于代码的想法都是受欢迎的。因此,我从未找到JS解决方案,而且我似乎已经让So社区的至少21名成员感到困惑,但我最终做了以下工作:
var weekArray=new array()所示代码>和上面的后续循环(生成上面的第一个表)
lkup.getRange('D2').setValue(weekArray)代码>
=SUMIF($D$2:$D$43,“志愿者SVC”、$E$2:$E$43)
var categoriesArray=lkup.getRange('F2:K3').getValues()收集新的SUMIF'd数组代码>
我仍然相信有更好的方法(还有一些干衣机),但我没有找到,你也没有发布。你可以随时留下评论。我相信有更好的方法,但这是有效的。我用你的示例数据进行了测试
function getData(){
var sheet = SpreadsheetApp.getActiveSheet();
var lr=sheet.getLastRow();
var data = sheet.getRange(2,1,lr-1,2).getValues();
var data=data.sort();
data.push(["",""]);
sumValues(data,lr)
}
function sumValues(data,lr){
var newData = new Array();
for(var i=1;i<lr;i++){
if(data[i-1][0] == data[i][0]){
data[i][1]=parseFloat(data[i][1])+parseFloat(data[i-1][1]);
newData.push([data[i][0],data[i][1]]);
i=i+1.
}
else if(data[i-1][0] !== data[i][0]){
newData.push([data[i-1][0],data[i-1][1]])};
}
newData.push(["",""]);
dupcheck(newData);
}
function dupcheck(data){
var dup=0;
var lr=data.length;
var l=data.length-1;
for(var i=0;i<l;i++){
if(data[i+1][0] == data[i][0]){
var dup =dup+ 1};
}
if(dup>0){
sumValues(data,lr)
}
else{
var sheet = SpreadsheetApp.getActiveSheet();
var lr = sheet.getLastRow();
sheet.getRange(2, 1, lr,data[0].length).clear({contentsOnly:true});
sheet.getRange(2, 1, data.length,data[0].length).setValues(data);
}}
函数getData(){
var sheet=SpreadsheetApp.getActiveSheet();
var lr=sheet.getLastRow();
var数据=sheet.getRange(2,1,lr-1,2).getValues();
var data=data.sort();
数据推送([“”,“”]);
sumValues(数据,lr)
}
函数sum值(数据,lr){
var newData=newarray();
对于(var i=1;i
function getData(){
var sheet = SpreadsheetApp.getActiveSheet();
var lr=sheet.getLastRow();
var data = sheet.getRange(2,1,lr-1,2).getValues();
var data=data.sort();
data.push(["",""]);
sumValues(data,lr)
}
function sumValues(data,lr){
var newData = new Array();
for(var i=1;i<lr;i++){
if(data[i-1][0] == data[i][0]){
data[i][1]=parseFloat(data[i][1])+parseFloat(data[i-1][1]);
newData.push([data[i][0],data[i][1]]);
i=i+1.
}
else if(data[i-1][0] !== data[i][0]){
newData.push([data[i-1][0],data[i-1][1]])};
}
newData.push(["",""]);
dupcheck(newData);
}
function dupcheck(data){
var dup=0;
var lr=data.length;
var l=data.length-1;
for(var i=0;i<l;i++){
if(data[i+1][0] == data[i][0]){
var dup =dup+ 1};
}
if(dup>0){
sumValues(data,lr)
}
else{
var sheet = SpreadsheetApp.getActiveSheet();
var lr = sheet.getLastRow();
sheet.getRange(2, 1, lr,data[0].length).clear({contentsOnly:true});
sheet.getRange(2, 1, data.length,data[0].length).setValues(data);
}}