質問編集履歴
3
目的、サンプル画像の追加。実現したいこと、試した事の修正。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,10 +1,28 @@
|
|
1
|
+
### 目的
|
2
|
+
|
3
|
+
会社で工数を管理するツールを作成したい。
|
4
|
+
|
5
|
+
![イメージ説明](e393ae10dfabf1a87b02acda4402d2e9.png)
|
6
|
+
|
7
|
+
サンプルのスプレッドシートの図を確認して頂ければイメージが付きやすいと思うのですが、
|
8
|
+
|
9
|
+
B列の月曜日のセルに右の業務一覧から、業務を選択してコピペをします。
|
10
|
+
|
11
|
+
そうするとH列にB列内の背景色をカウントした数が表示されます。
|
12
|
+
|
13
|
+
背景色の参照をしているのはG列の業務一覧のセルです。
|
14
|
+
|
15
|
+
|
16
|
+
|
1
17
|
### 前提・実現したいこと
|
2
18
|
|
3
19
|
|
4
20
|
|
5
21
|
① GoogleAppScriptでスプレッドシートの指定の列の背景色カウント
|
6
22
|
|
7
|
-
②
|
23
|
+
② 「工数再計算」という独自のボタンをトリガーに指定セルを更新したい
|
24
|
+
|
25
|
+
↳更新したいのはH列の関数が入っているセルです
|
8
26
|
|
9
27
|
|
10
28
|
|
@@ -18,19 +36,11 @@
|
|
18
36
|
|
19
37
|
|
20
38
|
|
21
|
-
「onEdit」を使
|
39
|
+
「onEdit」などを使って、
|
22
|
-
|
40
|
+
|
23
|
-
|
41
|
+
スプレッドシートを更新しても、値は更新されず、
|
24
|
-
|
25
|
-
|
42
|
+
|
26
|
-
|
27
|
-
というところまで理解したのですが、
|
28
|
-
|
29
|
-
**どんな処理を書くか?**が分からなくて困っています。
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
43
|
+
毎回セルに関数を張りなおさないと数字が更新されない状態です。
|
34
44
|
|
35
45
|
|
36
46
|
|
@@ -108,11 +118,149 @@
|
|
108
118
|
|
109
119
|
|
110
120
|
|
121
|
+
//スプレッドシートに独自メニューボタンを追加
|
122
|
+
|
123
|
+
//https://tonari-it.com/gas-spreadsheet-addmenu-onopen/#toc3
|
124
|
+
|
125
|
+
function onOpen(e){
|
126
|
+
|
127
|
+
//メニュー配列
|
128
|
+
|
129
|
+
var myMenu=[
|
130
|
+
|
131
|
+
{name: "工数再計算", functionName: "recalculate"},
|
132
|
+
|
133
|
+
];
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
//メニューを追加
|
138
|
+
|
139
|
+
SpreadsheetApp.getActiveSpreadsheet().addMenu("再計算",myMenu);
|
140
|
+
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
|
111
|
-
//
|
145
|
+
//選択したシートを再計算させる
|
146
|
+
|
112
|
-
|
147
|
+
function recalculate(){
|
148
|
+
|
149
|
+
var activeRange = SpreadsheetApp.getActiveRange();
|
150
|
+
|
151
|
+
var originalFormulas = activeRange.getFormulas();
|
152
|
+
|
153
|
+
var originalValues = activeRange.getValues();
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
var valuesToEraseFormula = [];
|
158
|
+
|
159
|
+
var valuesToRestoreFormula = [];
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
originalFormulas.forEach(function(outerVal, outerIdx){
|
164
|
+
|
165
|
+
valuesToEraseFormula[outerIdx] = [];
|
166
|
+
|
167
|
+
valuesToRestoreFormula[outerIdx] = [];
|
168
|
+
|
169
|
+
outerVal.forEach(function(innerVal, innerIdx){
|
170
|
+
|
171
|
+
if('' === innerVal){
|
172
|
+
|
173
|
+
//The cell doesn't have formula
|
174
|
+
|
175
|
+
valuesToEraseFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
|
176
|
+
|
177
|
+
valuesToRestoreFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
|
178
|
+
|
179
|
+
}else{
|
180
|
+
|
181
|
+
//The cell has a formula.
|
182
|
+
|
183
|
+
valuesToEraseFormula[outerIdx][innerIdx] = '';
|
184
|
+
|
185
|
+
valuesToRestoreFormula[outerIdx][innerIdx] = originalFormulas[outerIdx][innerIdx];
|
186
|
+
|
187
|
+
}
|
188
|
+
|
189
|
+
})
|
190
|
+
|
191
|
+
})
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
activeRange.setValues(valuesToEraseFormula);
|
196
|
+
|
197
|
+
activeRange.setValues(valuesToRestoreFormula);
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
function onInstall(e) {
|
204
|
+
|
205
|
+
onOpen(e);
|
206
|
+
|
207
|
+
}
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
以下の関数をExcelのH11に挿入しています。
|
214
|
+
|
215
|
+
「範囲B1:B31のセルの色」と「G11の色」が一致した数が「H11」に表示されます。
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
```Excel
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
=countCellsWithBackgroundColor(getBackgroundColor("G11"), "B1:B31")
|
224
|
+
|
225
|
+
業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
226
|
+
|
227
|
+
```
|
228
|
+
|
229
|
+
このサンプルの画像の場合、
|
230
|
+
|
231
|
+
「昼休憩(青のセル)」は「範囲(月曜日の列)」内で1つです。
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
### 試したこと
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
・H11のセルをコピーまたは切り取りしてそのままH11にペーストしても値は更新されない
|
242
|
+
|
243
|
+
↳コピーまたは切り取り後に一度セルの値を削除してペーストすると値は更新される。
|
244
|
+
|
245
|
+
・teratail内で[似ている質問](https://teratail.com/questions/21724)があったので
|
246
|
+
|
247
|
+
onEditメソッド内に以下の文章を入れたところ、
|
248
|
+
|
249
|
+
編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
onEditのメソッドの挙動は問題ないと思います。
|
254
|
+
|
255
|
+
```GoogleAppScript
|
256
|
+
|
113
|
-
function onEdit(e
|
257
|
+
function onEdit(e){
|
258
|
+
|
114
|
-
|
259
|
+
var range = e.range;
|
260
|
+
|
261
|
+
if(range.getColumn() == 1){
|
262
|
+
|
115
|
-
|
263
|
+
range.setNote('Last modified: ' + new Date());
|
116
264
|
|
117
265
|
}
|
118
266
|
|
@@ -120,63 +268,11 @@
|
|
120
268
|
|
121
269
|
```
|
122
270
|
|
123
|
-
|
271
|
+
・以下記事を参考に関数を実行
|
124
|
-
|
272
|
+
|
125
|
-
|
273
|
+
セルの数式を取得→セルの数式削除→取得した数式をペースト
|
126
|
-
|
127
|
-
|
274
|
+
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
```Excel
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
=countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
|
136
|
-
|
137
|
-
業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
138
|
-
|
139
|
-
```
|
140
|
-
|
141
|
-
### 試したこと
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
275
|
+
[Google Sheetで選択したセルを再計算させるApps Script](https://qiita.com/katz/items/28635f226df172e2f36a)
|
146
|
-
|
147
|
-
onEditメソッド内に以下の文章を入れたところ、
|
148
|
-
|
149
|
-
編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
|
150
|
-
|
151
|
-
onEditのメソッドの挙動は問題ないと思います。
|
152
|
-
|
153
|
-
```GoogleAppScript
|
154
|
-
|
155
|
-
function onEdit(e){
|
156
|
-
|
157
|
-
var range = e.range;
|
158
|
-
|
159
|
-
if(range.getColumn() == 1){
|
160
|
-
|
161
|
-
range.setNote('Last modified: ' + new Date());
|
162
|
-
|
163
|
-
}
|
164
|
-
|
165
|
-
}
|
166
|
-
|
167
|
-
```
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
### 懸念点
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
毎回編集する度に更新だと以下の点が気になります。
|
176
|
-
|
177
|
-
・同時に2つのセルをコピペなどで編集した場合どうなるのか?
|
178
|
-
|
179
|
-
・毎回更新していたら作業が進みにくそうなので、ボタンなどのトリガーで起動したほうがよい?
|
180
276
|
|
181
277
|
|
182
278
|
|
2
参考リンクの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -190,26 +190,28 @@
|
|
190
190
|
|
191
191
|
・全体の構成
|
192
192
|
|
193
|
-
https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
193
|
+
[webapps.stackexchange.com](https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells)
|
194
|
-
|
194
|
+
|
195
|
-
http://shanon-tech.blogspot.com/2015/12/2.html
|
195
|
+
[しゃのんあどべんとかれんだー 2日目 (忘年会幹事のちょっとしたお悩みをちょっと解決してくれるかもしれない GAS)](http://shanon-tech.blogspot.com/2015/12/2.html)
|
196
196
|
|
197
197
|
|
198
198
|
|
199
199
|
・スプレッドシートへのアクセス方法
|
200
200
|
|
201
|
-
https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
|
201
|
+
[【Qiita】Google Apps Script で Spreadsheet にアクセスする方法まとめ](https://qiita.com/negito6/items/c64a7a8589faaffcfdcf)
|
202
202
|
|
203
203
|
|
204
204
|
|
205
205
|
・トリガー
|
206
206
|
|
207
|
+
[Google公式ドキュメント](https://developers.google.com/apps-script/guides/triggers/)
|
208
|
+
|
207
|
-
https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
|
209
|
+
[GAS入門 スプレッドシートのセル編集時のイベントトリガーまとめ](https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2)
|
208
|
-
|
210
|
+
|
209
|
-
http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
211
|
+
[Google Spreadsheetのトリガーの「編集時」と「値の変更」の違いを検証してみた](http://madachugakusei.hatenablog.com/entry/2015/10/18/140439)
|
210
212
|
|
211
213
|
|
212
214
|
|
213
215
|
・Tetatail内の似ている質問
|
214
216
|
|
215
|
-
https://teratail.com/questions/21724
|
217
|
+
[【GoogleAppsScript】OnEditを特定の範囲においてのみ動作させる方法](https://teratail.com/questions/21724)
|
1
内容の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -22,7 +22,15 @@
|
|
22
22
|
|
23
23
|
ユーザーがスプレッドシートの値を変更したときに実行されるので
|
24
24
|
|
25
|
-
「onEdit」のメソッド内に
|
25
|
+
「onEdit」のメソッド内に処理をかけば良い。
|
26
|
+
|
27
|
+
というところまで理解したのですが、
|
28
|
+
|
29
|
+
**どんな処理を書くか?**が分からなくて困っています。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
なので現在、毎回セルに関数を張りなおさないと数字が更新されない状態です。
|
26
34
|
|
27
35
|
|
28
36
|
|
@@ -30,19 +38,7 @@
|
|
30
38
|
|
31
39
|
|
32
40
|
|
33
|
-
```GoogleAppScript
|
41
|
+
```GoogleAppScript
|
34
|
-
|
35
|
-
//参考URL https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
36
|
-
|
37
|
-
// http://shanon-tech.blogspot.com/2015/12/2.html
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
//=countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
|
42
|
-
|
43
|
-
// 業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
44
|
-
|
45
|
-
|
46
42
|
|
47
43
|
function getBackgroundColor(rangeSpecification) {
|
48
44
|
|
@@ -112,37 +108,57 @@
|
|
112
108
|
|
113
109
|
|
114
110
|
|
115
|
-
//アクセス方法まとめ
|
116
|
-
|
117
|
-
//https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
|
118
|
-
|
119
|
-
//シートID 1Absxwsnc1VyxCP7CLoTkTl2twWJuQcSHLd7OHNmJusg
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
//トリガー https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
|
124
|
-
|
125
|
-
//http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
126
|
-
|
127
|
-
//https://teratail.com/questions/21724
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
111
|
// onEdit Event
|
134
112
|
|
135
113
|
function onEdit(event) {
|
136
114
|
|
137
|
-
// 編集
|
115
|
+
// ここに編集したシートを更新する処理をいれる?
|
116
|
+
|
138
|
-
|
117
|
+
}
|
118
|
+
|
119
|
+
}
|
120
|
+
|
121
|
+
```
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
以下の関数をExcelのA2セルに挿入しています。
|
126
|
+
|
139
|
-
|
127
|
+
「範囲C1:C31のセルの色」と「A9の色」が一致した数が「A2」に表示されます。
|
128
|
+
|
129
|
+
|
130
|
+
|
140
|
-
|
131
|
+
```Excel
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
=countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
|
136
|
+
|
137
|
+
業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
138
|
+
|
139
|
+
```
|
140
|
+
|
141
|
+
### 試したこと
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
teratail内で[似ている質問](https://teratail.com/questions/21724)があったので
|
146
|
+
|
147
|
+
onEditメソッド内に以下の文章を入れたところ、
|
148
|
+
|
149
|
+
編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
|
150
|
+
|
151
|
+
onEditのメソッドの挙動は問題ないと思います。
|
152
|
+
|
153
|
+
```GoogleAppScript
|
154
|
+
|
155
|
+
function onEdit(e){
|
156
|
+
|
141
|
-
var range =
|
157
|
+
var range = e.range;
|
142
158
|
|
143
159
|
if(range.getColumn() == 1){
|
144
160
|
|
145
|
-
range.setNote('
|
161
|
+
range.setNote('Last modified: ' + new Date());
|
146
162
|
|
147
163
|
}
|
148
164
|
|
@@ -152,16 +168,48 @@
|
|
152
168
|
|
153
169
|
|
154
170
|
|
171
|
+
### 懸念点
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
毎回編集する度に更新だと以下の点が気になります。
|
176
|
+
|
177
|
+
・同時に2つのセルをコピペなどで編集した場合どうなるのか?
|
178
|
+
|
179
|
+
・毎回更新していたら作業が進みにくそうなので、ボタンなどのトリガーで起動したほうがよい?
|
180
|
+
|
181
|
+
|
182
|
+
|
155
|
-
###
|
183
|
+
### 参考URL
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
184
|
+
|
160
|
-
|
161
|
-
|
162
|
-
|
185
|
+
|
186
|
+
|
163
|
-
|
187
|
+
今回こちらのScriptを組む上で参考にしたURL集です。
|
188
|
+
|
189
|
+
|
190
|
+
|
164
|
-
|
191
|
+
・全体の構成
|
192
|
+
|
165
|
-
|
193
|
+
https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
194
|
+
|
166
|
-
|
195
|
+
http://shanon-tech.blogspot.com/2015/12/2.html
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
・スプレッドシートへのアクセス方法
|
200
|
+
|
201
|
+
https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
・トリガー
|
206
|
+
|
207
|
+
https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
|
208
|
+
|
209
|
+
http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
210
|
+
|
211
|
+
|
212
|
+
|
167
|
-
|
213
|
+
・Tetatail内の似ている質問
|
214
|
+
|
215
|
+
https://teratail.com/questions/21724
|