回答編集履歴

4

sheet index

2022/11/18 16:57

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -71,3 +71,39 @@
71
71
  }
72
72
  }
73
73
  ```
74
+
75
+ ##### シートのインデックス番号で指定する場合
76
+ 追加でご質問いただいた分です。
77
+ - `.getIndex()`でシートのインデックス番号を取得します。
78
+ - シートのインデックス番号は0ではなく、`1`から始まるので注意です。
79
+
80
+ ```javascript
81
+ function writeUpdateDate(e) {
82
+ // 編集されたシートを取得
83
+ const sheet = e.source.getActiveSheet();
84
+
85
+ // 編集されたシートのインデックス番号を取得
86
+ const sheetIndex = sheet.getIndex();
87
+ // 対象シートのインデックス番号を格納した配列。
88
+ // シートのインデックスは1から開始します。私の画像の例では、1が非対象、2,3が対象
89
+ const targetSheetIndexes = [2, 3];
90
+ // 編集されたシートが、対象のシートかどうか判定
91
+ const isTargetSheet = targetSheetIndexes.includes(sheetIndex);
92
+
93
+ // 非対象のシートだったら、ここで処理を終了。以降の処理は実行されない
94
+ if (!isTargetSheet) return;
95
+
96
+ // 編集されたセルの行番号を取得
97
+ const activeRow = e.range.getRow();
98
+ // 編集されたセルの列番号を取得
99
+ const activeCol = e.range.getColumn();
100
+
101
+ // 行が12行目以上、かつ、セルが7番目または8番目の場合
102
+ if (activeRow > 11 && (activeCol === 7 || activeCol === 8)) {
103
+ // 更新日時を書き込みたいセルを取得
104
+ const targetCell = sheet.getRange('I' + activeRow);
105
+ // 日時を書き込む
106
+ targetCell.setValue(new Date());
107
+ }
108
+ }
109
+ ```

3

コード追加

2022/11/18 09:51

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -8,6 +8,10 @@
8
8
 
9
9
  ### コード例
10
10
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-18/3b7f9d6d-eb2d-48b4-bdd8-8ee66ffc7854.png)
11
+
12
+ ##### 対象のシート名に共通の文字列がある場合
13
+ 「対象シート」という文字列を含む名前のシートだけが、更新日時書き込みの対象となるように処理しています。
14
+
11
15
  ```javascript
12
16
  function writeUpdateDate(e) {
13
17
  // 編集されたシートを取得
@@ -33,4 +37,37 @@
33
37
  }
34
38
  }
35
39
  ```
40
+
41
+ ##### 対象のシート名を指定する場合
36
- 私のコードでは「対象シート」という文字列を含む名前のシートだけ、更新日時書き込みの対象とるように処理してます。今後更新日時を書き込む必要ない対象で関係のなシートも出てくると思い、機能的追加てみした
42
+ 対象シート名前に関連性がない場合はコード使にくいと思いますので別の方法を以下ご提案しま
43
+ 対象のシート名を配列に格納して、編集されたシート名が、その配列の中にあるかどうか判定する方法です。
44
+
45
+ ```javascript
46
+ function writeUpdateDate(e) {
47
+ // 編集されたシートを取得
48
+ const sheet = e.source.getActiveSheet();
49
+
50
+ // 編集されたシートのシート名を取得
51
+ const sheetName = sheet.getSheetName()
52
+ // (更新日時書き込みの)対象のシート名
53
+ const targetSheetNames = ['対象シート1', '対象シート2'];
54
+ // 編集されたシートが、対象のシートかどうか判定
55
+ const isTargetSheet = targetSheetNames.includes(sheetName);
56
+
57
+ // 非対象のシートだったら、ここで処理を終了。以降の処理は実行されない
58
+ if (!isTargetSheet) return;
59
+
60
+ // 編集されたセルの行番号を取得
61
+ const activeRow = e.range.getRow();
62
+ // 編集されたセルの列番号を取得
63
+ const activeCol = e.range.getColumn();
64
+
65
+ // 行が12行目以上、かつ、セルが7番目または8番目の場合
66
+ if (activeRow > 11 && (activeCol === 7 || activeCol === 8)) {
67
+ // 更新日時を書き込みたいセルを取得
68
+ const targetCell = sheet.getRange('I' + activeRow);
69
+ // 日時を書き込む
70
+ targetCell.setValue(new Date());
71
+ }
72
+ }
73
+ ```

2

へんこう

2022/11/18 09:09

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -1,12 +1,10 @@
1
+ ### 不具合の原因&欠点
2
+ - 質問者様のコードは、どのシートでもいいので12行目以上のセルGかHが編集されたら、シート名「1」と「2」のシートに更新日時が書き込まれる処理を書かれています。
3
+ - `var sheet = ss.getSheetByName('2'); //対象のシート名を選択( ()部分にシート名記載)` ←このようにシート名を指定してシートを取得しているからです。
4
+ - シート名を指定してシートを取得するのではなく、「編集されたシート」を取得するようにしましょう。
5
+ - `.getActiveCell()`を使ってしまうと、スクリプトエディタ画面から`inputDate()`関数を実行した場合でも、対象のセルだったら更新日時が書き込まれてしまいます。スプレッドシートを編集して値を更新したわけではないのに…。
1
- onEditトリガーを設定した関数の第一引数には、イベントオブジェクトが自動で渡されます。
6
+ - onEditトリガーを設定した関数の第一引数には、イベントオブジェクトが自動で渡されます。
2
- そのイベントオブジェクトから編集情報を取得することができます。
7
+ - そのイベントオブジェクトから編集情報を取得することができます。そちらを利用するといいでしょう。
3
- そちらを利用するといいでしょう。
4
-
5
- また質問者様のコードは、どのシートでもいいので12行目以上のセルGかHが編集されたら、全てのシートに更新日時が書き込まれる処理を書かれています。
6
-
7
- `var sheet = ss.getSheetByName('2'); //対象のシート名を選択( ()部分にシート名記載)`
8
- ↑このようにシート名を指定してシートを取得しているからです。
9
- シート名を指定してシートを取得するのではなく、「編集のあったシート」を取得するようにしましょう。
10
8
 
11
9
  ### コード例
12
10
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-18/3b7f9d6d-eb2d-48b4-bdd8-8ee66ffc7854.png)

1

誤字修正

2022/11/18 08:53

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -26,7 +26,7 @@
26
26
  // 編集されたセルの列番号を取得
27
27
  const activeCol = e.range.getColumn();
28
28
 
29
- // 行が12行目以上、かつ、セルが7番目または8番目の場合
29
+ // 行が12行目以上、かつ、が7番目または8番目の場合
30
30
  if (activeRow > 11 && (activeCol === 7 || activeCol === 8)) {
31
31
  // 更新日時を書き込みたいセルを取得
32
32
  const targetCell = sheet.getRange('I' + activeRow);