0

在谷歌电子表格中,我使用 javascript 创建了一个嵌套的二维数组。

“小时”表是员工为不同类别添加不同小时的地方。有一个带有 submit() 函数触发器的图像。“批准”表格从“小时”表格中接收一些数据,经理可以在这些表格中批准。

这是脚本:

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);
  }

现在它只是将二维数组转储到“批准”表的 D1 中。

示例输出:

ESL               | 2
-------------------------
Parent Engagement | 8
-------------------------
School Liaison    | 2.75
-------------------------
School Liaison    | 6.25
-------------------------
School Liaison    | 7.25
-------------------------
Tutoring          | 3.25
-------------------------
Tutoring          | 4
-------------------------
Tutoring          | 4.5
-------------------------
Unclaimed         | 2.5
-------------------------
Volunteer Svcs    | 2

我想组合 col1 中的类似项目并将 col2 中的类似值相加,我想在输出结果之前在 javascript 中执行此操作。

因此,示例输出将变为:

ESL               | 2
-------------------------
Parent Engagement | 8
-------------------------
School Liaison    | 16.25
-------------------------
Tutoring          | 11.75
-------------------------
Unclaimed         | 2.5
-------------------------
Volunteer Svcs    | 2

有任何想法吗?我已经在使用2D Arrays Library并且这些功能似乎都不符合要求。

weekArray 看起来像:{ "category", val ; "category", val ; ... }

此外,欢迎任何关于干燥代码的想法。

4

2 回答 2

0

所以,从来没有找到一个 JS 解决方案,我似乎难倒了 SO 社区的至少 21 名成员,但我最终做了以下事情:

  1. 收集小时数和类别数组,如上面的var weekArray = new Array();循环和后续循环所示(产生上面的第一个表)
  2. 将它们转储到单独工作表上的两列中:lkup.getRange('D2').setValue(weekArray);
  3. 在每个类别的单独工作表上使用 SUMIF 函数=SUMIF($D$2:$D$43,"Volunteer Svcs",$E$2:$E$43)
  4. 用 JS 收集新的 SUMIF 数组:var categoriesArray = lkup.getRange('F2:K3').getValues();

并从那里继续。

我仍然必须相信那里有更好的方法(以及一些 DRYer JS 可以做到这一点),但我没有找到它,你也没有发布它。您可以随时发表评论。

于 2013-03-06T00:16:58.207 回答
0

我相信有更好的方法,但这有效。我用您的示例数据对其进行了测试。

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);
}}
于 2014-12-18T02:54:08.753 回答