これはあなたが望む結果を得る可能な方法です。私はそれをカスタム関数として書きました。つまり、フォームに表示したいセルに配置する必要があります=dayToToday()
これは、中間値を示すためのいくつかのログとコメントを含むスクリプトです。
function dayToToday(x){
var sh = SpreadsheetApp.getActiveSheet();
Logger.log(sh.getActiveCell().getRowIndex())
var refcell = sh.getRange(sh.getActiveCell().getRowIndex(),1).getValue();;// get value in column A to get the reference date
var refTime = new Date(refcell);
var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var today = new Date();
var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var day = parseInt(TD-ref);// get the difference in days (integer value )
return day ; // return result that will be in cell
}
編集:
あなたのユースケースを理解したら、カスタム関数のアプローチを放棄することをお勧めします(私はそれがあまり好きではないので、私は決して使用しません)、タイマートリガーおよび/またはメニューを使用して値を更新するこのソリューションに進みますスプレッドシートを 1 つのバッチにまとめます。
(ps : すぐに回答できなくて申し訳ありません... 最近忙しすぎます :-)
function onOpen() {
var menuEntries = [ {name: "test function", functionName: "toTrigger"},
];
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.addMenu("test menu",menuEntries);//
}
// create a timer trigger that will call "toTrigger" every 15 minutes
function toTrigger(){
var sh = SpreadsheetApp.getActiveSheet();
var data = sh.getRange(1,1,sh.getLastRow(),2).getValues();
for(var n=0;n<data.length;++n){
if(typeof(data[n][0])=='object'){
data[n][1]=dayToToday(data[n][0])
}
}
sh.getRange(1,1,sh.getLastRow(),2).setValues(data)
}
function dayToToday(x){
var refcell = x;;// get value in column A to get the reference date
var refTime = new Date(refcell);
var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var today = new Date();
var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var day = parseInt(TD-ref);// get the difference in days (integer value )
return day ; // return result that will be in cell
}
2番目の編集:
使用時var data = sh.getRange(1,1,sh.getLastRow(),2).getValues();
getRange の数値は開始行、開始列、行数、列数であるため、必要な列を含む範囲を取得し、 data [n][columnNumber-1] を使用して対応する値を取得する必要があります. (-1 配列は 0 から始まり、列は 1 からカウントされるため (実際には A ですが、A は最初の列です ;-)) 変数参照が必要な場合は、2 つの変数 (参照と参照) を受け入れるように関数を変更する必要があるため、お知らせください。別のもの)。
最後の編集(願っています)
いくつかの詳細を変更しました... J と F に対応する [9] と [5] のインデックスを参照してください
function toTrigger(){
var sh = SpreadsheetApp.getActiveSheet();
var data = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
for(var n=0;n<data.length;++n){
if(typeof(data[n][9])=='object'){
data[n][5]=dayToToday(data[n][9])
}
}
sh.getRange(1,1,data.length,data[0].length).setValues(data)
}
更新/編集
数時間の結果 (コメントのリクエストに続く)
function hoursToToday(x){
var refcell = x;;// get value in column A to get the reference date
var refTime = new Date(refcell);
var refhrs = refTime.getHours();
var ref = refTime.setHours(refhrs,0,0,0)/3600000;// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var today = new Date();
var todayHrs = today.getHours()
var TD = today.setHours(todayHrs,0,0,0)/3600000;// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days
var hrs = TD-ref;// get the difference in days (integer value )
return hrs ; // return result that will be in cell
}