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

回答編集履歴

4

誤った回答を記載してしまい失礼しました

2020/12/08 00:34

投稿

sawa
sawa

スコア3004

answer CHANGED
@@ -1,3 +1,42 @@
1
+ 昨日の回答は私の認識違いで、どうも new Date() の影響かGASの自作関数だと、シートを開きなおした際に再計算され日時が更新されてしまうようです。失礼しました。
2
+
3
+ 諦めて普通の onEdit でのコードを記載しておきます。
4
+ シートに関数を入れる必要はありません。
5
+
6
+ onEditは編集をトリガーとしていますが、途中のifで該当のシート、列、行範囲以外を除外し、
7
+ チェックを外したり、プルダウンを空欄に戻した際は時刻を消すようにしています。
8
+
9
+ シートの開き直し等では動かないので、勝手に時刻が更新される問題は解消されるはずです。
10
+
11
+
12
+ ```
13
+ function onEdit(e) {
14
+ var targetsheet = "シート〇〇" // 対象シート名
15
+
16
+ //操作されたセルの情報 シート名、行、列を取得
17
+ var sheet = e.range.getSheet().getSheetName();
18
+ var r = e.range.getRow();
19
+ var c = e.range.getColumn();
20
+
21
+ if(sheet != targetsheet) return; //対象シート以外を除外
22
+ if(c != 5 | r <=2) return; // E列(5列目)以外と、1,2行目を除外
23
+
24
+ if(!e.value | e.value == 'FALSE'){
25
+ e.range.getSheet().getRange(r, c+1).clearContent(); 
26
+  // チェックを外したり空欄とした際に日時を消去
27
+ return;
28
+ }
29
+ e.range.getSheet().getRange(r, c+1).setValue(new Date());
30
+  //シート側で表示設定を日時とする
31
+ }
32
+ ```
33
+
34
+
35
+
36
+
37
+ **【以下は、誤りです。開きなおした際に再計算されてしまいました。失礼しました。】**
38
+ ---
39
+
1
40
  単純にタイムスタンプを返す自作関数なら、もっとシンプルでいいです。
2
41
  GASの自作関数は、参照する引数に動きがあった時のみ再計算されます。
3
42
  スプレッドシートの開きなおしは影響しません。

3

補足を追加

2020/12/08 00:34

投稿

sawa
sawa

スコア3004

answer CHANGED
@@ -20,4 +20,17 @@
20
20
  `=timestamp(NOT(OR(E25=FALSE,E25="")),E25)`
21
21
 
22
22
 
23
- 参照している セル(上記なE25)に変化があった時のみ更新され、チェックを外したりプルダウンの選択した値を削除(空欄)とした場合は、空欄を返します。
23
+ 参照している セル(上記なE25)に変化があった時のみ更新され、チェックを外したりプルダウンの選択した値を削除(空欄)とした場合は、空欄を返します。
24
+
25
+
26
+
27
+ もちろん、この判別処理を GAS側で書いても良いです。
28
+
29
+ ```
30
+ function timestamp2(x) {
31
+ if(x === false | x ==="") return;
32
+ return new Date();
33
+ }
34
+ ```
35
+
36
+ この場合は単スプレッドシート側は、単純に `=timestamp(E25)` で動作します。

2

再度数式修正

2020/12/07 12:39

投稿

sawa
sawa

スコア3004

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  E25にプルダウンかチェックボックスがあるとして、チェックボックスにチェックが付いた時、もしくはプルダウンでなんらかの値が選択された時刻を返すには F25に以下の式を入れて、表示形式を日時としてください。
18
18
 
19
19
 
20
- `=timestamp(NOT(OR(E25=FALSE,E25="")),E25))`
20
+ `=timestamp(NOT(OR(E25=FALSE,E25="")),E25)`
21
21
 
22
22
 
23
23
  参照している セル(上記なE25)に変化があった時のみ更新され、チェックを外したりプルダウンの選択した値を削除(空欄)とした場合は、空欄を返します。

1

数式の誤りを修正

2020/12/07 12:26

投稿

sawa
sawa

スコア3004

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  E25にプルダウンかチェックボックスがあるとして、チェックボックスにチェックが付いた時、もしくはプルダウンでなんらかの値が選択された時刻を返すには F25に以下の式を入れて、表示形式を日時としてください。
18
18
 
19
19
 
20
- `=timestamp(IF(E25=FALSE,,E25<>""))`
20
+ `=timestamp(NOT(OR(E25=FALSE,E25="")),E25))`
21
21
 
22
22
 
23
23
  参照している セル(上記なE25)に変化があった時のみ更新され、チェックを外したりプルダウンの選択した値を削除(空欄)とした場合は、空欄を返します。