回答編集履歴
4
sheet index
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
コード追加
test
CHANGED
@@ -8,6 +8,10 @@
|
|
8
8
|
|
9
9
|
### コード例
|
10
10
|

|
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
へんこう
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
|

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