将单元格格式化为:分钟,秒,毫秒

时间:2013-11-23 13:07:29

标签: google-apps-script format google-sheets milliseconds

我有一张电子表格,我输入赛车时间,排名是自动计算的。 问题是,电子表格无法读取格式mm:ss,xxx(x代表毫秒)

当我使用冒号时 - >> 02:02:333 它会认为它的2小时2分333秒(我想要的是2分钟,2秒和333毫秒),这将把它转换为02:07:33

任何让我输入“02:02,333”并将其用作值的解决方案?

任何帮助表示赞赏! 托拜厄斯

2 个答案:

答案 0 :(得分:4)

更新:根据他分享的表单,更简单的方法是添加一个列并插入以下函数=mid(E2,4,2)*60+mid(E2,4,2)+mid(E6,7,3)*.001,其中E2是包含时间的单元格,单位为mm:ss, SSSformat。然后根据列值进行排名。

我的原始回答:这是一个脚本,它将处理突出显示的单元格,并将时间格式转换为毫秒,并将结果放在相邻的单元格中。由于我不知道你想对这些值做什么,你可以用返回的值做你想做的事。转换假定您只关心小时/分钟/秒而不是日期部分,但如果您查看代码,您可以看到您可以将任何格式传递给您,并且因为您获得了日期对象,您可以处理任何方式你要。这基本上复制了来自HERE的Matt Kruse的日期函数,只是将其修改为零时间部分(可选)并向标记化器添加毫秒。

// ------------------------------------------------------------------
// Utility functions for parsing 
// ------------------------------------------------------------------
function _isInteger(val) {
    var digits="1234567890";
    for (var i=0; i < val.length; i++) {
        if (digits.indexOf(val.charAt(i))==-1) { return false; }
        }
    return true;
    }
function _getInt(str,i,minlength,maxlength) {
    for (var x=maxlength; x>=minlength; x--) {
        var token=str.substring(i,i+x);
        if (token.length < minlength) { return null; }
        if (_isInteger(token)) { return token; }
        }
    return null;
    }


// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string, zeroTimes )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0. 
// ------------------------------------------------------------------
function getDateFromFormat(val,format, zeroTimes) {
    val=val+"";
    format=format+"";
    var i_val=0;
    var i_format=0;
    var c="";
    var token="";
    var token2="";
    var x,y;
    var now=new Date();
    var year=now.getYear();
    var month=now.getMonth()+1;
    var date=now.getDate();
    var hh=now.getHours();
    var mm=now.getMinutes();
    var ss=now.getSeconds();
    var sss=now.getMilliseconds();
  if(zeroTimes){
    hh=0;
     mm=0;
     ss=0;
     sss=0;
  }
    var ampm="";
  Logger.log(" getDateFromFormat(" + val +","+format+")");
    while (i_format < format.length) {
        // Get next token from format string
        c=format.charAt(i_format);
        token="";
        while ((format.charAt(i_format)==c) && (i_format < format.length)) {
            token += format.charAt(i_format++);
            }
        // Extract contents of value based on format token
        if (token=="yyyy" || token=="yy" || token=="y") {
            if (token=="yyyy") { x=4;y=4; }
            if (token=="yy")   { x=2;y=2; }
            if (token=="y")    { x=2;y=4; }
            year=_getInt(val,i_val,x,y);
            if (year==null) { return 0; }
            i_val += year.length;
            if (year.length==2) {
                if (year > 70) { year=1900+(year-0); }
                else { year=2000+(year-0); }
                }
            }
        else if (token=="MMM"||token=="NNN"){
            month=0;
            for (var i=0; i<MONTH_NAMES.length; i++) {
                var month_name=MONTH_NAMES[i];
                if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
                    if (token=="MMM"||(token=="NNN"&&i>11)) {
                        month=i+1;
                        if (month>12) { month -= 12; }
                        i_val += month_name.length;
                        break;
                        }
                    }
                }
            if ((month < 1)||(month>12)){return 0;}
            }
        else if (token=="EE"||token=="E"){
            for (var i=0; i<DAY_NAMES.length; i++) {
                var day_name=DAY_NAMES[i];
                if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
                    i_val += day_name.length;
                    break;
                    }
                }
            }
        else if (token=="MM"||token=="M") {
            month=_getInt(val,i_val,token.length,2);
            if(month==null||(month<1)||(month>12)){return 0;}
            i_val+=month.length;}
        else if (token=="SSS"||token=="SS"||token=="S") {
            sss=_getInt(val,i_val,token.length,3);
            if(sss==null||(sss<0)){return 0;}
            i_val+=sss.length;
       Logger.log("Milli: " + sss);
      }
        else if (token=="dd"||token=="d") {
            date=_getInt(val,i_val,token.length,2);
            if(date==null||(date<1)||(date>31)){return 0;}
            i_val+=date.length;}
        else if (token=="hh"||token=="h") {
            hh=_getInt(val,i_val,token.length,2);
            if(hh==null||(hh<1)||(hh>12)){return 0;}
            i_val+=hh.length;}
        else if (token=="HH"||token=="H") {
            hh=_getInt(val,i_val,token.length,2);
            if(hh==null||(hh<0)||(hh>23)){return 0;}
            i_val+=hh.length;}
        else if (token=="KK"||token=="K") {
            hh=_getInt(val,i_val,token.length,2);
            if(hh==null||(hh<0)||(hh>11)){return 0;}
            i_val+=hh.length;}
        else if (token=="kk"||token=="k") {
            hh=_getInt(val,i_val,token.length,2);
            if(hh==null||(hh<1)||(hh>24)){return 0;}
            i_val+=hh.length;hh--;}
        else if (token=="mm"||token=="m") {
            mm=_getInt(val,i_val,token.length,2);
            if(mm==null||(mm<0)||(mm>59)){return 0;}
            i_val+=mm.length;}
        else if (token=="ss"||token=="s") {
            ss=_getInt(val,i_val,token.length,2);
            if(ss==null||(ss<0)||(ss>59)){return 0;}
            i_val+=ss.length;
          Logger.log("Seconds: " + ss);
        }

        else if (token=="a") {
            if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
            else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
            else {return 0;}
            i_val+=2;}
        else {
            if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
            else {i_val+=token.length;}
            }
        }
   Logger.log("Year: "+year+" Month: " +month+ " date " +date+ " hour "  +hh+ " minutes "+mm+ " seconds " +ss+"  milli " +sss);

    // If there are any trailing characters left in the value, it doesn't match
    if (i_val != val.length) { return 0; }
    // Is date valid for month?
    if (month==2) {
        // Check for leap year
        if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
            if (date > 29){ return 0; }
            }
        else { if (date > 28) { return 0; } }
        }
    if ((month==4)||(month==6)||(month==9)||(month==11)) {
        if (date > 30) { return 0; }
        }
    // Correct hours value
    if (hh<12 && ampm=="PM") { hh=hh-0+12; }
    else if (hh>11 && ampm=="AM") { hh-=12; }
    var newdate=new Date(year,month-1,date,hh,mm,ss);
    newdate.setMilliseconds(sss);
    return newdate;
    }

/**
 */
function formatSelection() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var dayMillis = 24*3600*1000;  //miliseconds in a day
  var range = SpreadsheetApp.getActiveSheet().getActiveRange();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      Logger.log("Current Value: "+ currentValue);
      var newDate=new Date();
      newDate=getDateFromFormat(currentValue,"mm:ss,SSS",true);
      var convertedNewDate=parseInt(newDate/dayMillis);
      Logger.log(" New Date: " + newDate + " Converted Value: " + convertedNewDate);
      var newTime=newDate.getHours()*1000*60*60+newDate.getMinutes()*1000*60+newDate.getSeconds()*1000+newDate.getMilliseconds();
      SpreadsheetApp.getActiveSheet().getRange(range.getCell(i,j).getRow(),range.getCell(i,j).getColumn()+1).setValue("Milliseconds: "+ newTime);
      //range.getCell(i,j).setValue(convertedNewDate);
      //.setNumberFormat("mm:ss,SSS");

    }
  }


};

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Format as Value",
    functionName : "formatSelection"
  }];
  sheet.addMenu("Time Functions", entries);
};

答案 1 :(得分:0)

=if(B4>=60,trunc(divide(B4,60),0)&":"&trunc(mod(B4,60),0)&":"&round(mod(B4,60),0)* 100,0),trunc(mod(B4,60),0)&":"&round(mod(B4,1)*100,0))

单元格 B4 = 137.35(137.35 秒)

显示为 2:17:35(2 分 17 秒,35 百秒)

单元格 B4 = 27.73(27.73 秒)

显示为 27:73(27 秒,73 百秒)