質問編集履歴
3
目的、サンプル画像の追加。実現したいこと、試した事の修正。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,21 +1,26 @@
|
|
1
|
+
### 目的
|
2
|
+
会社で工数を管理するツールを作成したい。
|
3
|
+

|
4
|
+
サンプルのスプレッドシートの図を確認して頂ければイメージが付きやすいと思うのですが、
|
5
|
+
B列の月曜日のセルに右の業務一覧から、業務を選択してコピペをします。
|
6
|
+
そうするとH列にB列内の背景色をカウントした数が表示されます。
|
7
|
+
背景色の参照をしているのはG列の業務一覧のセルです。
|
8
|
+
|
1
9
|
### 前提・実現したいこと
|
2
10
|
|
3
11
|
① GoogleAppScriptでスプレッドシートの指定の列の背景色カウント
|
4
|
-
②
|
12
|
+
② 「工数再計算」という独自のボタンをトリガーに指定セルを更新したい
|
13
|
+
↳更新したいのはH列の関数が入っているセルです
|
5
14
|
|
6
15
|
### 発生している問題・エラーメッセージ
|
7
16
|
|
8
17
|
①の背景色のカウントについては実現できましたが、
|
9
18
|
②でつまずいております。
|
10
19
|
|
11
|
-
「onEdit」を使
|
20
|
+
「onEdit」などを使って、
|
12
|
-
|
21
|
+
スプレッドシートを更新しても、値は更新されず、
|
13
|
-
「onEdit」のメソッド内に処理をかけば良い。
|
14
|
-
というところまで理解したのですが、
|
15
|
-
|
22
|
+
毎回セルに関数を張りなおさないと数字が更新されない状態です。
|
16
23
|
|
17
|
-
なので現在、毎回セルに関数を張りなおさないと数字が更新されない状態です。
|
18
|
-
|
19
24
|
### 該当のソースコード
|
20
25
|
|
21
26
|
```GoogleAppScript
|
@@ -53,26 +58,72 @@
|
|
53
58
|
return x;
|
54
59
|
}
|
55
60
|
|
56
|
-
//
|
61
|
+
//スプレッドシートに独自メニューボタンを追加
|
62
|
+
//https://tonari-it.com/gas-spreadsheet-addmenu-onopen/#toc3
|
57
|
-
function
|
63
|
+
function onOpen(e){
|
64
|
+
//メニュー配列
|
65
|
+
var myMenu=[
|
66
|
+
{name: "工数再計算", functionName: "recalculate"},
|
67
|
+
];
|
68
|
+
|
58
|
-
//
|
69
|
+
//メニューを追加
|
59
|
-
|
70
|
+
SpreadsheetApp.getActiveSpreadsheet().addMenu("再計算",myMenu);
|
60
71
|
}
|
72
|
+
|
73
|
+
//選択したシートを再計算させる
|
74
|
+
function recalculate(){
|
75
|
+
var activeRange = SpreadsheetApp.getActiveRange();
|
76
|
+
var originalFormulas = activeRange.getFormulas();
|
77
|
+
var originalValues = activeRange.getValues();
|
78
|
+
|
79
|
+
var valuesToEraseFormula = [];
|
80
|
+
var valuesToRestoreFormula = [];
|
81
|
+
|
82
|
+
originalFormulas.forEach(function(outerVal, outerIdx){
|
83
|
+
valuesToEraseFormula[outerIdx] = [];
|
84
|
+
valuesToRestoreFormula[outerIdx] = [];
|
85
|
+
outerVal.forEach(function(innerVal, innerIdx){
|
86
|
+
if('' === innerVal){
|
87
|
+
//The cell doesn't have formula
|
88
|
+
valuesToEraseFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
|
89
|
+
valuesToRestoreFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
|
90
|
+
}else{
|
91
|
+
//The cell has a formula.
|
92
|
+
valuesToEraseFormula[outerIdx][innerIdx] = '';
|
93
|
+
valuesToRestoreFormula[outerIdx][innerIdx] = originalFormulas[outerIdx][innerIdx];
|
94
|
+
}
|
95
|
+
})
|
96
|
+
})
|
97
|
+
|
98
|
+
activeRange.setValues(valuesToEraseFormula);
|
99
|
+
activeRange.setValues(valuesToRestoreFormula);
|
100
|
+
}
|
101
|
+
|
102
|
+
function onInstall(e) {
|
103
|
+
onOpen(e);
|
104
|
+
}
|
61
105
|
```
|
62
106
|
|
63
|
-
以下の関数をExcelの
|
107
|
+
以下の関数をExcelのH11に挿入しています。
|
64
|
-
「範囲
|
108
|
+
「範囲B1:B31のセルの色」と「G11の色」が一致した数が「H11」に表示されます。
|
65
109
|
|
66
110
|
```Excel
|
67
111
|
|
68
|
-
=countCellsWithBackgroundColor(getBackgroundColor("
|
112
|
+
=countCellsWithBackgroundColor(getBackgroundColor("G11"), "B1:B31")
|
69
113
|
業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
70
114
|
```
|
115
|
+
このサンプルの画像の場合、
|
116
|
+
「昼休憩(青のセル)」は「範囲(月曜日の列)」内で1つです。
|
117
|
+
|
118
|
+
|
71
119
|
### 試したこと
|
72
120
|
|
121
|
+
・H11のセルをコピーまたは切り取りしてそのままH11にペーストしても値は更新されない
|
122
|
+
↳コピーまたは切り取り後に一度セルの値を削除してペーストすると値は更新される。
|
73
|
-
teratail内で[似ている質問](https://teratail.com/questions/21724)があったので
|
123
|
+
・teratail内で[似ている質問](https://teratail.com/questions/21724)があったので
|
74
124
|
onEditメソッド内に以下の文章を入れたところ、
|
75
125
|
編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
|
126
|
+
|
76
127
|
onEditのメソッドの挙動は問題ないと思います。
|
77
128
|
```GoogleAppScript
|
78
129
|
function onEdit(e){
|
@@ -82,13 +133,10 @@
|
|
82
133
|
}
|
83
134
|
}
|
84
135
|
```
|
136
|
+
・以下記事を参考に関数を実行
|
137
|
+
セルの数式を取得→セルの数式削除→取得した数式をペースト
|
138
|
+
[Google Sheetで選択したセルを再計算させるApps Script](https://qiita.com/katz/items/28635f226df172e2f36a)
|
85
139
|
|
86
|
-
### 懸念点
|
87
|
-
|
88
|
-
毎回編集する度に更新だと以下の点が気になります。
|
89
|
-
・同時に2つのセルをコピペなどで編集した場合どうなるのか?
|
90
|
-
・毎回更新していたら作業が進みにくそうなので、ボタンなどのトリガーで起動したほうがよい?
|
91
|
-
|
92
140
|
### 参考URL
|
93
141
|
|
94
142
|
今回こちらのScriptを組む上で参考にしたURL集です。
|
2
参考リンクの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -94,15 +94,16 @@
|
|
94
94
|
今回こちらのScriptを組む上で参考にしたURL集です。
|
95
95
|
|
96
96
|
・全体の構成
|
97
|
-
https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
97
|
+
[webapps.stackexchange.com](https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells)
|
98
|
-
http://shanon-tech.blogspot.com/2015/12/2.html
|
98
|
+
[しゃのんあどべんとかれんだー 2日目 (忘年会幹事のちょっとしたお悩みをちょっと解決してくれるかもしれない GAS)](http://shanon-tech.blogspot.com/2015/12/2.html)
|
99
99
|
|
100
100
|
・スプレッドシートへのアクセス方法
|
101
|
-
https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
|
101
|
+
[【Qiita】Google Apps Script で Spreadsheet にアクセスする方法まとめ](https://qiita.com/negito6/items/c64a7a8589faaffcfdcf)
|
102
102
|
|
103
103
|
・トリガー
|
104
|
+
[Google公式ドキュメント](https://developers.google.com/apps-script/guides/triggers/)
|
104
|
-
https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
|
105
|
+
[GAS入門 スプレッドシートのセル編集時のイベントトリガーまとめ](https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2)
|
105
|
-
http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
106
|
+
[Google Spreadsheetのトリガーの「編集時」と「値の変更」の違いを検証してみた](http://madachugakusei.hatenablog.com/entry/2015/10/18/140439)
|
106
107
|
|
107
108
|
・Tetatail内の似ている質問
|
108
|
-
https://teratail.com/questions/21724
|
109
|
+
[【GoogleAppsScript】OnEditを特定の範囲においてのみ動作させる方法](https://teratail.com/questions/21724)
|
1
内容の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,17 +10,15 @@
|
|
10
10
|
|
11
11
|
「onEdit」を使えば、
|
12
12
|
ユーザーがスプレッドシートの値を変更したときに実行されるので
|
13
|
-
「onEdit」のメソッド内に
|
13
|
+
「onEdit」のメソッド内に処理をかけば良い。
|
14
|
+
というところまで理解したのですが、
|
15
|
+
**どんな処理を書くか?**が分からなくて困っています。
|
14
16
|
|
17
|
+
なので現在、毎回セルに関数を張りなおさないと数字が更新されない状態です。
|
18
|
+
|
15
19
|
### 該当のソースコード
|
16
20
|
|
17
|
-
```GoogleAppScript
|
21
|
+
```GoogleAppScript
|
18
|
-
//参考URL https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
19
|
-
// http://shanon-tech.blogspot.com/2015/12/2.html
|
20
|
-
|
21
|
-
//=countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
|
22
|
-
// 業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
23
|
-
|
24
22
|
function getBackgroundColor(rangeSpecification) {
|
25
23
|
var sheet = SpreadsheetApp.getActiveSheet();
|
26
24
|
var cell = sheet.getRange(rangeSpecification);
|
@@ -55,30 +53,56 @@
|
|
55
53
|
return x;
|
56
54
|
}
|
57
55
|
|
58
|
-
//
|
56
|
+
// onEdit Event
|
59
|
-
|
57
|
+
function onEdit(event) {
|
60
|
-
//シート
|
58
|
+
// ここに編集したシートを更新する処理をいれる?
|
59
|
+
}
|
60
|
+
}
|
61
|
+
```
|
61
62
|
|
62
|
-
|
63
|
+
以下の関数をExcelのA2セルに挿入しています。
|
63
|
-
//http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
64
|
-
|
64
|
+
「範囲C1:C31のセルの色」と「A9の色」が一致した数が「A2」に表示されます。
|
65
65
|
|
66
|
+
```Excel
|
66
67
|
|
68
|
+
=countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
|
69
|
+
業務一覧(昼休憩)↑ ↑範囲(月曜日の列)
|
70
|
+
```
|
71
|
+
### 試したこと
|
72
|
+
|
73
|
+
teratail内で[似ている質問](https://teratail.com/questions/21724)があったので
|
67
|
-
|
74
|
+
onEditメソッド内に以下の文章を入れたところ、
|
75
|
+
編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
|
76
|
+
onEditのメソッドの挙動は問題ないと思います。
|
77
|
+
```GoogleAppScript
|
68
|
-
function onEdit(
|
78
|
+
function onEdit(e){
|
69
|
-
// 編集のあったシート
|
70
|
-
var ss = event.source.getActiveSheet();
|
71
|
-
var range =
|
79
|
+
var range = e.range;
|
72
80
|
if(range.getColumn() == 1){
|
73
|
-
|
81
|
+
range.setNote('Last modified: ' + new Date());
|
74
82
|
}
|
75
83
|
}
|
76
84
|
```
|
77
85
|
|
78
|
-
###
|
86
|
+
### 懸念点
|
79
87
|
|
80
|
-
|
88
|
+
毎回編集する度に更新だと以下の点が気になります。
|
89
|
+
・同時に2つのセルをコピペなどで編集した場合どうなるのか?
|
90
|
+
・毎回更新していたら作業が進みにくそうなので、ボタンなどのトリガーで起動したほうがよい?
|
81
91
|
|
82
|
-
###
|
92
|
+
### 参考URL
|
83
93
|
|
84
|
-
こ
|
94
|
+
今回こちらのScriptを組む上で参考にしたURL集です。
|
95
|
+
|
96
|
+
・全体の構成
|
97
|
+
https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells
|
98
|
+
http://shanon-tech.blogspot.com/2015/12/2.html
|
99
|
+
|
100
|
+
・スプレッドシートへのアクセス方法
|
101
|
+
https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
|
102
|
+
|
103
|
+
・トリガー
|
104
|
+
https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
|
105
|
+
http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
|
106
|
+
|
107
|
+
・Tetatail内の似ている質問
|
108
|
+
https://teratail.com/questions/21724
|