質問編集履歴

3

目的、サンプル画像の追加。実現したいこと、試した事の修正。

2020/05/13 02:33

投稿

Risney
Risney

スコア148

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
- 「onEdit」のメソッド内に処理をかけば良い。
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
- // onEdit Event
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(event) {
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
- 以下数をExcelのA2セルに挿入ています。
273
+ セルの数取得→セルの数式削除→取得た数式をペースト
126
-
127
- 「範囲C1:C31のセルの色」と「A9の色」が一致した数が「A2」に表示されます。
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
- teratail内[似てい質問](https://teratail.com/questions/21724)があったので
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

参考リンクの修正

2020/05/13 02:33

投稿

Risney
Risney

スコア148

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

内容の修正

2020/04/24 06:35

投稿

Risney
Risney

スコア148

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(JavaScript)
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
- var ss = event.source.getActiveSheet();
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 = ss.event.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
- onEditメソッド
184
+
160
-
161
-
162
-
185
+
186
+
163
- ### 補足情報(FW/ツールバージョンなど)
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