如何通过迭代计算时间

时间:2019-06-25 14:17:56

标签: javascript datetime google-apps-script google-sheets

Google脚本如何处理时间和日期。

如果工作表中已将时间值输入到单元格中(2:00、1:30等,表示2小时和1小时30),并且您要遍历各行,将总计相加(因此将得出上述结果)在3:30);您如何告诉Google脚本将它们添加在一起;在提到您所知道的时间时,您是否总是必须使用“新日期({INSERT CELL HERE})”?

我正在尝试获取将所有时间值加起来的代码,如果超过22.5小时(22小时30分钟-不在晚上十点半)可以执行某些操作。

function ValidateForm(Action) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
var totalpaidovertime = 0.0;
var totalinlieutime = 0.0;
  var totalhours =  0.0; //new Date("January 01, 2019 00:00");
var validatedtotalhours = 0.0;
var validatedinlieuhours = 0.0;
var validatedtotalpaidovertime = 0.0;
var ui = SpreadsheetApp.getUi();
var hoursclaimed = sheet.getRange("F4:F35").getValues();

  if(spreadsheet.getActiveSheet().getName()=="Totals"){
    Browser.msgBox("Incorrect Sheet For This Action","Please select a users sheet to validate first and try again.",ui.ButtonSet.OK);
  }else{
    if (Action == "Check Overtime"){
      //get totalhours
      for (var r=0;r<=hoursclaimed.length;r++){
        if (hoursclaimed[r].getValue() !=""){
          totalhours+=hoursclaimed[r];       
        }
      }   
      Logger.log(sheet.getRange("f4").getValue()
      //calculate totalpaidovertime variable - 22.5 is 3 days of 7.5 work day.
      if(totalhours > 22.5) {
        totalpaidovertime = 22.5;
      }
      else {
        totalpaidovertime = totalhours;
      }
      //calculate totalinlieutime variable
      if(totalhours > 22.5) {
        totalinlieutime = totalhours - 22.5;
      }
      else {
        totalinlieutime = 0.0;
      }

      if (totalhours > 22.5) {
        Browser.msgBox("Total number of hours equals " + totalhours + " hours. Only 22.5 hours (3 days) will be added to Paid Overtime.");
      }

2 个答案:

答案 0 :(得分:1)

将持续时间从电子表格传递到Google Apps脚本上的服务器端代码很麻烦,因为Google表格和Google Apps脚本/ JavaScript使用不同的纪元。好消息是,我们可以使用getDisplayValue()getDisplayValues()在几种情况下,使获取持续时间成为文本值变得更容易,然后将时间的每个部分首先解析为文本,然后将其转换为数字。 / p>

答案 1 :(得分:1)

没有实现您想要的目标的特定方法,但是您可以使用displayValues函数[1]以字符串形式获取值并对其进行处理以实现您的宏伟目标。

这是我成功制作并测试成功的示例实现,您只需更改代码的这两部分即可:

1)要获取数组数组,每个数组都将字符串作为唯一值,如果单元格为空,则为空: var hoursclaimed = sheet.getRange(“ F4:F35”)。getDisplayValues();

2)在这种情况下,当单元格为空时,它将返回一个未定义的对象,因此为了避免空单元格,我使用了isArray()函数。然后,您将获得字符串并使用substring函数对其进行操作,以获取分钟和小时,将其转换为数字并使用它们。

  for (var r=0;r<=hoursclaimed.length;r++){
    var valueArray = hoursclaimed[r];

    if (Array.isArray(valueArray)){
      var str = valueArray[0];
      var minutes = Number(str.substring(str.length - 2, str.length));
      var hours = Number(str.substring(0, str.length - 3));
      totalhours+=(minutes/60) + hours;       
    }
  } 

其他解决方案:

您还可以像现在一样使用getValues()函数(它将获取日期数组),然后使用javascript函数“ getHours”和“ getMinutes”,而不是操作字符串:

var minutes = date.getMinutes();
var hours = date.getHours();

[1] https://developers.google.com/apps-script/reference/spreadsheet/range#getDisplayValues()