【问题标题】:Calculating with time用时间计算
【发布时间】:2023-03-12 22:26:01
【问题描述】:

编辑:2020.07.24。 这是一个电子表格,您可以在其中看到我的问题。 https://docs.google.com/spreadsheets/d/1-knADrKsStLz5lS_9gayHpZFcaZPsEbBMmrpOGXGMqg/edit?usp=sharing

我有一个电子表格(我不能分享),用脚本制作了我自己的自定义函数。

=cutomF(A1,A2,A3)  
A1 = 8:00  (1899.12.30.08:00)
A2 = 16:00 (1899.12.30.16:00)
A3 = 05:00 (1899.12.30.05:00)

在脚本中,如果我只用其中两个时间(如 A2-A1)进行计算,它会返回一个正确的数字,我需要除以 /1000/60/60/24

但如果我想计算这个:A2-A3-A1 它只会返回极端错误的数字。

有什么问题吗?

编辑: 代码从我的语言稍微改写为英语......

在电子表格单元格中有这样的时间内容 08:00;

我想存档类似工人之间的比较。

function CUSTOM_WORK_TIME(ROW_DATA,DAY,KM,ADDRESS,AVERAGE_KM,AVERAGE_ADDRESS,AVERAGE_TIME){
    
    if(ROW_DATA[0][0]!=""){
        Utilities.sleep(50);

        var WORK_TIME;
        var WORK_OVERTIME;
        var WORK_TIME_WEEKEND = ((ROW_DATA[0][2]-ROW_DATA[0][1])/1000/60/60/24);

        var return_array = [[]];

        var KM_RATE = ((KM/AVERAGE_KM)*0.33);
        var ADDRESS_RATE = ((ADDRESS/AVERAGE_ADDRESS)*0.33);
        var TIME_RATE = ((ROW_DATA[0][2]-ROW_DATA[0][1])/AVERAGE_TIME)*0.34;
        var PRINT_THIS;
        
        PRINT_THIS = (ROW_DATA[0][2]-ROW_DATA[0][1])/1000/60/60/24; // JUST FOR TESTING

        switch (ROW_DATA[0][0]){
            case "TRANSPORT":
            if(ROW_DATA[0][2]!="" && ROW_DATA[0][1]!=""){
                
                Utilities.sleep(100);
                
                if(DAY=="SATURDAY" || DAY=="SUNDAY"){
                    return_array[0][0] = "";
                    return_array[0][1] = "";
                    return_array[0][2] = WORK_TIME_WEEKEND;
                    return return_array;
                }else{
                    Utilities.sleep(200);
                    
                    WORK_TIME = ((ROW_DATA[0][2]-ROW_DATA[0][1])/1000/60/60/24);
                    if(WORK_TIME >(9/24)){
                        WORK_OVERTIME = (((ROW_DATA[0][2]-ROW_DATA[0][1])/1000/60/60/24) - (9/24))*(TIME_RATE+KM_RATE+ADDRESS_RATE);
                        WORK_TIME = (9/24);
                        return_array[0][0] = WORK_TIME;
                        return_array[0][1] = WORK_OVERTIME;
                        return_array[0][2] = "";
                        return return_array;
                        // return PRINT_THIS;
                    }else{
                        return_array[0][0] = WORK_TIME*(TIME_RATE+KM_RATE+ADDRESS_RATE);
                        return_array[0][1] = "";
                        return_array[0][2] = "";
                        return return_array;
                    }
                }
            }else{return "H";}

            break;
     
            default:
            break;
        }
    } 
}

【问题讨论】:

  • 显示你的脚本。
  • 嗨。你的预期结果是什么?内置日期减法 (=A2-A3-A1) 不起作用怎么办? (它适用于我的工作表,使用您的时间值。)您可以发布cutomF 的代码吗? (可能是customF 的错字?)
  • 如果你的函数是CUSTOM_WORK_TIME(ROW_DATA,DAY,KM)并且你像=CUSTOM_WORK_TIME(A1,A2,A3)一样使用它,这意味着你想要计算DAY-ROW_DATA-KM?如果不是 - 请显示cutomF的正确代码。
  • 做了一张表,看看有什么问题docs.google.com/spreadsheets/d/…
  • 我仍然不明白函数 CUSTOM_WORK_TIME 的用途(不在您的电子表格中)。你要计算A2-A3-A1吗?所以16:00-05:00-08:00?你期待什么结果? 3?

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


【解决方案1】:

我想我已经找到了您的问题的原因。我在您的工作表中添加了一个选项卡 Munkalap1-GK,我在其中展示了我的逻辑。要获得 9:54(9 小时 54 分钟)的值,我必须更改您的公式,并更改您的单元格格式。我添加的 customF2GK 函数使用的新公式是:

function customF2(AVERAGE,START,END,WORK_RATIO) {
  return ((END-START)/AVERAGE)*WORK_RATIO*AVERAGE;}

其次,如果单元格格式为 hh:mm ss.sss 或类似格式,则计算失败。将它们格式化为纯数字,即一天的一小部分,并且公式有效。如果您愿意,可以使用隐藏单元格来保存传递给函数的数值。隐藏的单元格将仅指向当前单元格,例如。 A2、B2、C2,但格式为数字,而不是 hh:mm ss.sss。如果您不清楚,请告诉我。

在表格中处理时间时,我发现在一天中的几分之一内工作最容易,以防万一还涉及日期。但是,如果您知道您只处理时间而不是日期,也可以只使用几小时和一小时的几分之一(不是几分钟)。

让我知道这是否适合您。如果是这样,您将需要调整 customF1 和 customF3 函数以使用可比较的逻辑。

【讨论】:

  • 谢谢 Kirkg13!我只是不明白,为什么我不能从单元格中获取 RAW 数据。我认为格式化正在改变数据是不正常的。因为表格很大,有很多信息,所以我添加更多列只是为了获得正确的数据并不是最好的。
  • 我明白了。我相信 Excel 的行为不同,并且日期值始终被视为一个简单的数字,无论它的格式如何显示。但也许您可以做更多的研究,看看是否还有其他关于格式化如何影响 Google 表格中的计算的答案。我还没找到那个。
  • 如果此答案对您有所帮助,您可以查看它,以帮助其他有类似问题的人。见这里:stackoverflow.com/help/someone-answers
猜你喜欢
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多