0

いくつかのアクティビティの期間を時間形式[[HH]:MM:SS]で保存するGoogleスプレッドシートのログブックがあります。スプレッドシートはそのようなセルを問題なく追加します。ただし、Google Scriptを介してそれらを追加しようとすると、ごみが発生します。私が見つけたのは、そのようなセルに対してDate()オブジェクトが暗黙的に作成されていることですが、その値型のAPIが見つかりません。

データを24倍することで「時間整数」に変換できることはわかっていますが、多くのセルを複製する必要があるため、これは厄介な回避策です。私はむしろグーグルスクリプト自体でそれを行うことを可能にする解決策が欲しいです。

4

1 に答える 1

2

これがトリックを行う動作関数です。

私は最初にそれを日付としてフォーマットしようとしましたが、36時間は実際には標準ではありません!! だから私は少し数学をしました:-))

00:00:00それを機能させるには、スプレッドシート標準で参照日として使用する値を持つセルをどこかに設定する必要があります。私のコードではセルですD1(コードのコメントを参照してください。SSの参照日は1900年、Javascriptの参照日は1970年です...そのため、ミリ秒単位で70年の負の定数です...)

これがコードで、テストシートとロガーの画面キャプチャの下にあります。このコードを変更して、セル値をパラメーターとして受け取り、結果を配列として返す関数にすることをお勧めします([h、 m、s]または同様のもの)、このコードはそれがどのように機能するかを示すためだけのものです。

function addHoursValues() {
  var sh = SpreadsheetApp.getActive()
  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();
  var ref = sh.getRange('D1').getValue().getTime();
//var ref = -2209161600000 // you could also use this but it would be less obvious what it really does ;-)
Logger.log(ref+' = ref');
  var h1 = parseInt((hours1.getTime()/3600000)-ref/3600000);
  var h2 = parseInt((hours2.getTime()/3600000)-ref/3600000);
Logger.log(h1+' + '+h2+' = '+(h1+h2))
  var m1 = parseInt((hours1.getTime()-h1*3600000-ref)/60000);
  var m2 = parseInt((hours2.getTime()-h2*3600000-ref)/60000);
Logger.log(m1+' + '+m2+' = '+(m1+m2))
  var s1 = parseInt((hours1.getTime()-h1*3600000-m1*60000-ref)/1000);
  var s2 = parseInt((hours2.getTime()-h2*3600000-m2*60000-ref)/1000);
Logger.log(s1+' + '+s2+' = '+(s1+s2))
  var ts=s1+s2
  var tm=m1+m2
  var th=h1+h2
    if(ts>59){ts=ts-60;tm++};
    if(tm>59){tm=tm-60;th++}
Logger.log('sum = '+th+':'+tm+':'+ts)
}

ここに画像の説明を入力してください

ここに画像の説明を入力してください


編集:これは、それを使用する方法を示す対応するテスト関数を備えた2つの「関数」バージョンです

function getHMS(hrs) {
  var t = hrs.getTime()/1000;
  var ref = -2209161600;
  var h = parseInt((t-ref)/3600);
  var m = parseInt((t-h*3600-ref)/60);
  var s = parseInt(t-h*3600-m*60-ref);
  return[h,m,s];// returns an array of 3 discrete values
}

function testHMS(){
  var sh = SpreadsheetApp.getActive();

  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();

  var sumS = getHMS(hours1)[2]+getHMS(hours2)[2];// add seconds
  var sumM = getHMS(hours1)[1]+getHMS(hours2)[1];// add minutes
  var sumH = getHMS(hours1)[0]+getHMS(hours2)[0];// add hours
    if(sumS>59){sumS=sumS-60 ; sumM++}; // handles values >59
    if(sumM>59){sumM=sumM-60 ; sumH++}; // handles values >59
  Logger.log(sumH+':'+sumM+':'+sumS);
}

また

function addHMS(hrs1,hrs2) {
  var t1 = hrs1.getTime()/1000;
  var t2 = hrs2.getTime()/1000;
  var ref = -2209161600;
  var h = parseInt((t1-ref)/3600)+parseInt((t2-ref)/3600);
  var m = parseInt((t1-parseInt((t1-ref)/3600)*3600-ref)/60)+parseInt((t2-parseInt((t2-ref)/3600)*3600-ref)/60);
  var s = parseInt(t1-parseInt((t1-ref)/3600)*3600-parseInt((t1-parseInt((t1-ref)/3600)*3600-ref)/60)*60-ref)
         +parseInt(t2-parseInt((t2-ref)/3600)*3600-parseInt((t2-parseInt((t2-ref)/3600)*3600-ref)/60)*60-ref);
    if(s>59){s=s-60 ; m++}; // handles values >59
    if(m>59){m=m-60 ; h++}; // handles values >59
  return[h,m,s];// returns sum in an array of 3 discrete values
}

function othertestHMS(){
  var sh = SpreadsheetApp.getActive();

  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();
  Logger.log(addHMS(hours1,hours2));
}
于 2013-03-29T22:08:53.840 に答える