根据其他列计算Google电子表格中的日期列

时间:2018-03-17 23:33:17

标签: javascript google-sheets

我制作了一张处理药物的Google表格。

在A栏中,我服用了一系列药物。我最初服用药物的时间并不重要,但重要的是当我服用下一个药丸时,每个药丸都不同。一粒药丸,服用后,我需要在6小时后服用另一颗药丸,而另一颗药丸,直到24小时后才能服用。我每天都会在不同的时间睡觉,所以当我服用初始药丸时,取决于我什么时候醒来或者吃早餐等。最重要的一个是我需要等待6个小时才能再拿一次。那是我的止痛药。

到目前为止,我已经设置了表格,以便我有药物的下拉列表,第2列输入我服用避孕药的确切日期和时间。第3列,我有一个公式,设置为第2列并添加6小时,这对所有meds都不正确,所以这是我需要帮助的地方。我知道可以做到,但我不知道该问谁。如果我能得到它,那么第3列将会看到我选择了什么药物,然后根据哪个药物将我需要的时间用于下一个药物。这是我到目前为止所使用的公式,但是使用一个公式来增加适用于所有人的6小时,这就是为什么公式不会起作用的原因:

工作表

Medication        Pill-taken-at        +6 hours
----------------------------------------------------------
Mycoxofloppin     2018-03-17 12:44     2018-03-17 18:44 
Maryjaneaspliff   2018-03-16 04:20     2018-03-16 10:20

脚本

function onEdit(e) {
  var timezone = "GMT-5";
  var timestamp_format = "yyyy-MM-dd   hh:mm";
  var ss = e.source.getActiveSheet();
  var start = 2;
  var end = 4;
  var row = e.range.getRow();
  if (e.range.getColumn() == 1){
    ss.getRange(row, start).setValue(new Date());
  }
}

2 个答案:

答案 0 :(得分:1)

Range::getValue可以获得Google表格中单元格的价值' API。我假设您的单元格输入为DateTime,因此getValue()会为您提供一个JavaScript Date值,您可以轻松地执行日期计算。

如果您的单元格输入正确,则无需担心时区或日期格式。 ("键入"如"数据类型",不"键盘输入")。

function onEdit(event) {

    var range = event.range;
    if( range.getColumn() != 1 && range.getColumn() != 2 ) {
        // Only update when column 1 or 2 are updated.
        return;
    }
    var rowNumber = range.getRow();

    var ss = event.source.getActiveSheet();

    var drugName     = ss.getRange( rowNumber, 1 ).getValue();
    var lastDoseTime = ss.getRange( rowNumber, 2 ).getValue();

    // Validate info in the edited row:
    if( !drugName ) {
        console.warn( "No drug name specified in col 1, row %d.", rowNumber );
        return;
    }

    if( !( lastDoseTime instanceof Date ) ) {
        console.warn("No valid date value in col 2, row %d.", rowNumber );
        return;
    }

    var hoursUntilNextDose = getTimeBetweenDosesInHours( drugName );
    if( !hoursUntilNextDose ) {
        console.warn("No dose time available for the drug \"%s\".", drugName );
        return;
    }

    var timeUntilNextDoseInMilliseconds = hoursUntilNextDose * 60 * 60 * 1000;

    var nextDoseUnix = lastDoseTime.getTime() + timeUntilNextDoseInMilliseconds;
    var nextDoseTime = new Date( nextDoseUnix );

    ss.getRange( rowNumber, 3 ).setValue( nextDoseTime );
}

function getTimeBetweenDosesInHours( drugName ) {

    // toUpperCase() is more robust than toLowerCase(): https://msdn.microsoft.com/en-us/library/bb386042.aspx
    switch( drugName.toUpperCase() ) {
        case "MYCOXOFLOPPIN"  : return 6;
        case "MARYJANEASPLIFF": return 4.20;
        case "GYM"            : return 365 * 24;
        default               : return null;
    }
}

答案 1 :(得分:1)

使用表格:说

Y1: Pill Name    Z1:(Interval(hrs))    
Y2: Dumiliyuop   Z2: 6    
Y3: WhacyHittlir Z3:18    

C2:

=B2+VLOOKUP(A2,Y:Z,2,0)/24