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

回答編集履歴

2

回避について

2018/08/09 02:47

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -10,4 +10,43 @@
10
10
  [18-08-06 22:39:46:646 JST] Sheet.getActiveCell() [0 秒]
11
11
  [18-08-06 22:39:46:649 JST] 実行に失敗: 範囲外のセル参照です(行 8、ファイル「activecell139305」)(合計ランタイム 0.09 秒)
12
12
 
13
- いざ書いてみると、「!!」とかやったの恥ずかしくなってきたけど、あたってたらいいなー。期待を込めて"!"2つです!
13
+ いざ書いてみると、「!!」とかやったの恥ずかしくなってきたけど、あたってたらいいなー。期待を込めて"!"2つです!
14
+
15
+ -- エラー回避について追記
16
+ * エラーの発生について
17
+ 思い込みで書くとダメですね。嘘を言ってました。訂正してお詫びします。
18
+ 試行を繰り返したところ、Note編集時には、Sheetは取れるが、getActiveCell()をすると、この時点でエラー。つまり、Note変更時は、activecellがないという特殊モードに入るようです。
19
+
20
+ * エラーの回避について
21
+ 0. トリガーを変える
22
+ 0. イベント引数で判断する
23
+ 0. try catchする
24
+
25
+ あたりが可能かと思います。
26
+ 1. 今「値の変更」を使ってらっしゃいますが「編集」トリガーにすると、Noteの変更ではイベントが起動しない *ようです* 。ようです、と言うのは、私のアカウントが(エラーの出しすぎで?)おかしくなったのか、OnEditという関数名にすると自動的に編集時に呼ばれるという方法では動作するのですが、トリガーのところに編集時をセットしても動作しなくなり、検証できていないためです。
27
+
28
+ 2. `MemoAsLog(ev)`のようにすると、`ev`に値の変更時に次のようなイベントオブジェクトが入ります
29
+ ```javascript
30
+ // NOTEの挿入や削除のとき
31
+ {"changeType":"OTHER","source":{},"user":{"nickname":"メールアドレスの@の前?","email":"メールアドレス"},"authMode":{},"triggerUid":"idの数値"}
32
+ // セルの編集時
33
+ {"changeType":"EDIT","source":{},"user":{"nickname":"メールアドレスの@の前?,"email":"メールアドレス"},"authMode":{},"triggerUid":"idの数値"}
34
+ ```
35
+ このChangeTypeを見て動作をかえることができると思います。
36
+ 参考として、編集時のイベントオブジェクトは次のようになります(`OnEdit(ev)`のようにしたときの`ev`)
37
+ ```javascript
38
+ // dをeにかえた。
39
+ {"authMode":{},"range":{"columnStart":3,"rowStart":25,"rowEnd":25,"columnEnd":3},"source":{},"oldValue":"d","user":{"nickname":"","email":""},"value":"e"}
40
+ ```
41
+ ちなみにこの出力は`JSON.stringify(ev)`で得たものですが、GASのオブジェクトは出力できないようで、実際にはauthModeやsourceには中身があり、sourceにはspreadsheetが入っています(従って`ev.source.getName()`とかってやると"check list"が得られるのかもしれない。トリガの動作があやしくなっており、確認できてません)
42
+
43
+ 3. 1.2.があるので、これをやる意味はないですが、一般にエラーが予期されるもので、エラーで止まって欲しくないときは`try... catch`構文を使います。
44
+ ```javascript
45
+ var activeCell = undefined;
46
+ try {
47
+ activeCell = Sheet.getActiveCell();
48
+ } catch(e) {
49
+ Logger.log(e); // "Exception: 範囲の参照~"ってのが出ます。これもコピペを怠っており、今トリガが動作しないので正確な値をお示しできません。すみません。
50
+ }
51
+ ```
52
+ ただ、一般に`try catch`は重い処理なので(GASの場合APIアクセスのほうが重いでしょうが)回避できれば回避するのが定石です。

1

たいぽ

2018/08/09 02:47

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -10,4 +10,4 @@
10
10
  [18-08-06 22:39:46:646 JST] Sheet.getActiveCell() [0 秒]
11
11
  [18-08-06 22:39:46:649 JST] 実行に失敗: 範囲外のセル参照です(行 8、ファイル「activecell139305」)(合計ランタイム 0.09 秒)
12
12
 
13
- いざ書いてみると、「!!」とかやったの恥ずかしくなってきたけど、あたってらいいなー。期待を込めて"!"2つです!
13
+ いざ書いてみると、「!!」とかやったの恥ずかしくなってきたけど、あたってらいいなー。期待を込めて"!"2つです!