2017-10-28 4 views
1

私は、セルが特定の値を持つ時間を記録するために離れています。 例:H4 = ABCの場合、XYZに変更します。 H4がABCだった時間をXYZに変更する前に記録する必要があります。 Googleスクリプトライブラリでタイマー機能を見つけることができませんでした。 ご協力いただければ幸いです。 シートと現在実行中のすべてのスクリプトへのリンクです。 https://docs.google.com/spreadsheets/d/1eqOXVR9_2fe246PejvwUZd-Z1RoDN8OyS9B7Hk8FZRI/edit?usp=sharingレコードセルの値時間

答えて

0

GASのタイマー機能についてはわかりませんが、常に実行するのは最適ではありません。よりよい方法は、あなたが持っているタイムスタンプと現在の日付との間のセルの変化の時間差を計算することです。

それも時間の違いが含まれるように、私はthis functionを少し微調整しました:

function dateDiff(start, end) { 
    var diff = { years: 0, months: 0, days: 0 }; 
    var timeDiff = end - start; 

    if (timeDiff > 0) { 
    diff.years = end.getFullYear() - start.getFullYear(); 
    diff.months = end.getMonth() - start.getMonth(); 
    diff.days = end.getDate() - start.getDate(); 
    diff.hours = end.getHours() - start.getHours(); 
    if (diff.months < 0) { 
     diff.years--; 
     diff.months += 12; 
    } 

    if (diff.days < 0) { 
     diff.months = Math.max(0, diff.months - 1); 
     diff.days += 30; 
    } 
    if (diff.hours < 0) { 
     diff.days = Math.max(0, diff.days - 1); 
     diff.hours += 24; 
    } 

    } 

    return diff; 
}; 

そして今、このDateDiff関数を使用して、あなたのonEdit機能を:

function onEdit() { 
    // This section returns if you're not on the SBC/HP spreadsheet. 
    var sheet = "SBC/HP"; 

    var s = SpreadsheetApp.getActiveSheet(); 
    var r = s.getActiveCell(); 
    // if r is in column h { do the rest } 
    if(r.getColumn() != 11){ 
    var row = r.getRow(); 
    var previousDate = new Date(s.getRange(row, 11).getValue()); //getting the timestamp of the previous change. Looks like the year should be YYYY, not YY as it is now 
    var time = new Date(); 
    var timeDiff = dateDiff(previousDate, time); //calculating time difference in a separate function 
    time = Utilities.formatDate(time, "GMT-05:00", "MM/dd/yy, hh:mm:ss"); 
    s.getRange(row, 12).setValue(timeDiff.years + ' years ' + timeDiff.months + ' months ' + timeDiff.days + ' days ' + timeDiff.hours + ' hours'); //pasting time difference in some format in a separate cell 
    s.getRange('K' + row.toString()).setValue(time); 
    } 
} 

あなたはどのようにそれを確認することができます作品here

+0

変更、バックこんなに遅くなって申し訳ありませんが、これは非常にうまくいきました。日、時間、分のみを含むように、時間形式を少し変更しました。 –

0

Stackdriver LoggingonEdit()を組み合わせてください。次に、Log Filtersおよび/またはLog Exportingを使用して、INFOログのタイムスタンプを抽出します。

function onEdit (e) { 
    var message = e.range.getA1Notation() + " changed to " + e.value; 

    console.info({message:message}); 
} 

それはスクリプトエディタでLog ViewerView > Stackdriver Loggingをプロジェクトに取得します。ここからconsole.info()メッセージを除外し、Stackdriver Loggingメッセージに同じe.range.getA1Notation()を含むタイムスタンプとの時差を取得することができます。

Stackdriver Docs

関連する問題