【问题标题】:Sum up the time values corresponding to same date汇总同一日期对应的时间值
【发布时间】:2021-11-06 18:45:02
【问题描述】:

在我的工作表中,A 列是日期,B 列是持续时间值,我想找到重复的日期并总结重复日期的相应时间值,并显示最后一个相关重复日期的总和。并删除所有其他重复的日期。即如果 18/07/2019 重复 4 次,我必须将所有四个持续时间值相加,并在第 4 个重复位置显示和值,并删除前三个日期 18/07/2019。我必须这样做所有重复的日期。我已尽我所知编写代码

function countDate() {
var data = SpreadsheetApp.getActive();
var sheet = data.getSheetByName("Sheet5");
var lastRow = sheet.getLastRow(); 
var sh = sheet.getRange('A1:A'+lastRow);
var cell = sh.getValues();
var data= sheet.getRange('B1:B'+lastRow).getValues();
for (var i =0; i < lastRow; ++i){
var count = 0;
var column2 = cell[i][0];

 for (var j =0; j < i; j++)
   {
   var p=0;
   var column4 = cell[j][0]; 
     if (column4 - column2 === 0  )
       {
    var value1 = data[j][0];
    var value2 = data[i][0];
    var d = value2;
    d.setHours(value1.getHours()+value2.getHours()+0);
    d.setMinutes(value1.getMinutes()+value2.getMinutes());
    sheet.getRange('C'+(i+1)).setValue(d).setNumberFormat("[hh]:mm:ss");
    sheet.deleteRow(j+1-p);
    p++; 
       }  
    }
     }   
    }

显示工作表的副本

C 列是我通过上述代码获得的值,D 列是所需值

计算总和后,我需要在这里删除重复的行,直到 15

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    答案:

    您可以通过将 B 列转换为 Plain text 格式并使用 JavaScript 字典进行一些数据处理来做到这一点。

    代码:

    function sumThemAllUp() {
      var dict = {};
      var lastRow = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getLastRow();
      var dates = SpreadsheetApp.getActiveSpreadsheet().getRange('A1:A' + lastRow).getValues();
      var times = SpreadsheetApp.getActiveSpreadsheet().getRange('B1:B' + lastRow).getValues();
      
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
      sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setNumberFormat("@");
      
      for (var i = 0; i < dates.length; i++) {
        if (!dict[dates[i][0]]) {
          dict[dates[i][0]] = times[i][0];
        }
        else {
          var temp = dict[dates[i][0]];
          var hours = parseInt(temp.split(':')[0]);
          var minutes = parseInt(temp.split(':')[1]);
          var additionalHours = parseInt(times[i][0].split(':')[0]);
          var additionalMinutes = parseInt(times[i][0].split(':')[1]);
          var newMinutes = minutes + additionalMinutes;
          var newHours = hours + additionalHours;
          if (newMinutes > 60) {
            newHours = newHours + 1;
            newMinutes = newMinutes - 60;
          }
          dict[dates[i][0]] = newHours + ':' + newMinutes;
        }
      }
      
      SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('A1:B' + lastRow).clear();
      
      var keys = Object.keys(dict);
      for (var i = 0; i < keys.length; i++) {
        SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('A' + (i + 1)).setValue(keys[i]);
        SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('B' + (i + 1)).setValue(dict[keys[i]]);
      }
    }
    

    我的假设:

    我在写这篇文章时做了一些假设,你可以根据需要进行编辑,但我想我应该让你知道:

    • A 列中只有日期,B 列中只有时间。
    • B 列中的时间是小时:分钟或分钟:秒。无论哪种方式,如果 : 右侧的值达到 60,它会将左侧值加一并重置。
    • 电子表格中的工作表是第一张工作表; Spreadsheet.getSheets()[0] 返回的内容。

    参考资料:

    【讨论】:

    • 运行时出现错误“无法在对象中找到函数拆分 1899 年 12 月 30 日星期六 01:58:50 GMT+0530 (IST)。”对应这一行“var hours = parseInt(temp.split(':')[0]);”
    • 确保选择B列,并在运行脚本之前按照菜单路径Format &gt; Number &gt; Plain text
    • 这是完整程序的一部分,b 列是我在另一张纸上运行时程序的结果。然后我为这张表编写代码。那么是否可以自动将格式转换为纯文本
    • 绝对!您可以实现Range 类的setNumberFormat("@") 方法,将数字格式自动设置为给定范围。表格的日期和数字格式可以在here 找到,但对于纯文本,您只需要"@"
    • 我写成 times.setNumberFormat("@");但是现在我在对象 START TIME 中找不到函数 setNumberFormat,,,,,0,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,.
    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多