用Google脚本比较时间

时间:2018-12-26 14:01:05

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

我是编程领域的新手:D和我对小时数的比较感到怀疑。

我有一张包含以下信息的表

   Name | Time out | Time in |
   nam_1  10:00:00
   nam_2  09:00:00

已使用以下代码输入超时时间:

var start = Utilities.formatDate (new Date (), "Europe / Berlin", "HH: mm: ss");

sheet.appendRow([name, start]);

我想尝试的是:

var time_in = "13:00:00";
   if time out> 13:00:00:
      sheet.getRange(j+1, 2).setValue(time_in);

问题是我不知道该怎么做。我现在尝试的是:

function getTimeFromDateStartUserInput(date) { 
    return Utilities.formatDate(date, "Europe/Berlin", "HH:mm:ss");
}
function insertTimeIn(){
   var file = DriveApp.getFilesByName("MySheet");
   var doc = SpreadsheetApp.open(file.next());
   var sheet = doc.getSheetByName("Sheet1");
   if(sheet!=null){
      var dataRange = sheet.getDataRange();
      var values = dataRange.getValues();
      var time_in = new Date ('30/12/1899 17:00:00');
      time_in.setHours(13,0,0,0);
      var inFormated = getTimeFromDate(time_in);
      for(var i = 0; i<values.length; i++){
         if(values[i][1]>=inFormated && values[i][2]=""){
            sheet.getRange(j+1, 2).setValue(time_in);
      }else{
           sheet.getRange(j+1, 2).setValue("Nop");
      }

   }
}

但是,用该代码我什么都没做。

我认为问题可能是“超时”列中的任何条目都具有以下设计:星期六,格林尼治标准时间12月30日14:51:22 + 11:00 1899。

因此,我认为它不起作用,因为我正在将一个小时与一个完整的Date对象进行比较。

我认为合乎逻辑的事情是为所有值的输入[i] [1]调用函数getTimeFromDateStartUserInput,但我不知道该怎么做。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

这是我对您要尝试执行的操作的猜测。它不起作用,因为它仍然包含错误。我对其中一些进行了评论,但无法修复,因为仍不清楚您要做什么。

function insertTimeIn(){
  var files = DriveApp.getFilesByName('SpreadsheetName');
  var n=0;
  while(files.hasNext()){
    var file=files.next();
  }
  if(++n>1){
    throw("Error: There is more than one file with that name in function insertTimeIn");
    return;
  }
  if(file.getMimeType()==MimeType.GOOGLE_SHEETS){
    var doc=SpreadsheetApp.openById(file.getId());
    var sheet=doc.getSheetByName("Sheet1");
    if(sheet!=null){
      var dataRange=sheet.getDataRange();
      var values=dataRange.getValues();
      var time_in=new Date(1899,11,30,13,0,0);
      var inFormated=Utilities.formatDate(time_in, Session.getScriptTimeZone(), "HH:mm:ss");//it returns a string not a date
      for(var i=0;i<values.length;i++){
        if(values[i][1]>=inFormated && values[i][2]=""){//informated is a string not a date so greater than doesn't really make much sense here.
          sheet.getRange(j+1, 2).setValue(time_in);//j is undefined
        }else{
          sheet.getRange(j+1, 2).setValue("Nop");//again j is undefined
        }
      }
    }
  }
}

答案 1 :(得分:0)

一个简单的答案可能是将初始时间戳自动转换为当前日期。我不能完全确定工作表的用途,但是我使用工作表输入时间并使用函数onEdit()来验证用户是否正确输入了dateTime。

    function onEdit(){
if(cell.getValue() instanceof Date === true){
      if(cell.getValue().getFullYear()<2018 ){
      formatDate();
      }  
     }
    }


    function formatDate() {
    var timeValue, cell,hour,minute,time,row,dateObj,month,day,year,newDate
      cell = SpreadsheetApp.getActive().getActiveCell()
      timeValue = cell.getValue()
      hour = timeValue.getHours()
      minute = timeValue.getMinutes() < 10? '0'+timeValue.getMinutes(): timeValue.getMinutes();
      time = hour+":"+minute
      row = cell.getRow()
      dateObj = new Date();
      month = dateObj.getUTCMonth() + 1; //months from 1-12
      day = dateObj.getUTCDate();
      year = dateObj.getUTCFullYear();

    newDate = month + "/" + day + " "+ time; // formatted dateTimestamp to replace timestamp with

    cell.setValue(newDate)
    }

让我知道这是否对您有用。在我的应用程序中,onEdit函数检查活动单元格,如果输入的值是dateTime,则继续。如果是的话,它将检查日期是哪一年(时间值本身会自动为12/30/1899,因此,当获取介于dateTimestamp和没有日期的时间戳之间的持续时间时,会抛出通配符。