teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

tuiki2

2017/12/11 07:32

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -64,4 +64,23 @@
64
64
  }
65
65
  ```
66
66
 
67
+ (追記2)
68
+ ---
69
+ 質問本文に追記されていた「最終的にやりたいこと」に目が行っておりませんでした。
70
+ マクロで計算結果を出したいのではなく、マクロを使ってセルに数式をセットされたかったのですね。
71
+
72
+ これはもうミリ秒とかも関係なく、単純な話です。
73
+ 数式をセットしてあげればよいだけですので、数式の文字列を作成し、それをセルにセットしてあげれば実現できると思います。
74
+ ```
75
+ function minus23() {
76
+ var sheet = SpreadsheetApp.getActiveSheet()
77
+ var strFormula = '=C6-B6+"' + '23:00' + '"'
78
+ sheet.getRange("A1").setFormula(strFormula)
79
+ sheet.getRange("A2").setValue(strFormula)
80
+ }
81
+ ```
82
+ 上記ではA1セルにsetFormulaで、A2セルにsetValueで数式を設定しています。
83
+
84
+ setFormulaを使用した方が数式をセットしているということが明示されていてコードとしてわかりやすいのでお勧めしますが、実際にはどちらでも同じ結果が得られると思いますので好みの問題かと思います。
85
+
67
86
  参考になれば幸いです。

1

tuiki

2017/12/11 07:32

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -8,4 +8,60 @@
8
8
  23時間減算したいのなら、23(時間)*60(分)*60(秒)を引くということになると思います。
9
9
 
10
10
  手元に確認環境がないので検索結果だけでのアドバイスになりますが、ご確認ください。
11
+ 参考になれば幸いです。
12
+
13
+ (追記)
14
+ ---
15
+ 前回はweb検索結果からのアドバイスのみでしたが、今回実際に検証環境ができましたので追記させていただきます。
16
+
17
+ 前回、「秒換算してみては?」というようなアドバイスをさせていただいておりましたが、どうもそんな簡単な話でもなかったようでした。すみません。
18
+
19
+ ---
20
+ まずシート上の入力値について
21
+ 「経過時間」書式が設定されているセルを「数値型」書式に変更してみると、入力値が数値として表示されました。
22
+ この数値はどうやら日付単位の値になっているようです。
23
+ 例:`1:00:00`(1時間) ⇒ `0.0416666666666667` ≒ `1/24日`
24
+
25
+
26
+ 次にマクロ内で日付型変数の計算を行った結果を見てみると、こちらはどうやらミリ秒で結果が返されているようです。
27
+ 例:`10:00:00 - 6:00:00`(日付型で計算) ⇒ `14400000` = `4 * 60 * 60 * 1000`(4時間のミリ秒値)
28
+
29
+ これらを考慮して、マクロで計算した結果(ミリ秒)を経過時間書式の単位(日)に変換してあげれば計算ができそうです。
30
+
31
+ よくわからないところ
32
+ ---
33
+ 実際に上記の考え方でマクロを組んでみたところ、どうしても1日分のズレがでてしまいました。
34
+ テストではセルの値を`30:00:00`としており、ここから23時間引いた`7:00:00`という結果を得たかったのですが、どうしてもセルの取得値が`6:00:00`扱いとなってしまい`-17:00:00`という結果になってしまいます。
35
+
36
+ そこで`6:00:00`と入力したセルと`30:00:00`と入力したセルをそれぞれ用意し、Date型変数に取得して内容を比較してみたところ、
37
+ `6:00:00`と入力したセル:`1899年12月30日 06:00:00`
38
+ `30:00:00`と入力したセル:`1899年12月31日 06:00:00`
39
+ となっていました。
40
+
41
+ 日付型変数を年月日指定なしで`new Date(0,0,0,23,0,0)`のように作成すると`1899年12月31日 23:00:00`という値がセットされるので、てっきり基準日は`1899年12月31日 0:00:00`だと思っていたのですが、セルの日時は`1899年12月30日 0:00:00`が基準となっているようです。
42
+
43
+ 上記も考慮して正しい値で計算できるようになったマクロが以下になります。
44
+ ```
45
+ function minus23() {
46
+ var sheet = SpreadsheetApp.getActiveSheet()
47
+
48
+ var dtRet = new Date(); //計算結果
49
+
50
+ var dtCell = new Date(); //セル値
51
+ var dt23 = new Date(0,0,0-1,23,0,0); //23時間(基準日の-1日を考慮)
52
+
53
+ //セル値の取得
54
+ dtCell = sheet.getRange(2, 2).getValue();
55
+
56
+ //時間計算
57
+ dtRet = dtCell - dt23;
58
+
59
+ //Browser.msgBox(dtCell, Browser.Buttons.OK_CANCEL)
60
+ //Browser.msgBox(dt23, Browser.Buttons.OK_CANCEL)
61
+
62
+ sheet.getRange(2, 2).setValue(dtRet/1000/60/60/24); //ミリ秒⇒日変換
63
+
64
+ }
65
+ ```
66
+
11
67
  参考になれば幸いです。