teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

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

2020/05/13 02:33

投稿

Risney
Risney

スコア148

title CHANGED
File without changes
body CHANGED
@@ -1,21 +1,26 @@
1
+ ### 目的
2
+ 会社で工数を管理するツールを作成したい。
3
+ ![イメージ説明](e393ae10dfabf1a87b02acda4402d2e9.png)
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
- // onEdit Event
61
+ //スプレッドシートに独自メニューボタンを追加
62
+ //https://tonari-it.com/gas-spreadsheet-addmenu-onopen/#toc3
57
- function onEdit(event) {
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のA2セルに挿入しています。
107
+ 以下の関数をExcelのH11に挿入しています。
64
- 「範囲C1:C31のセルの色」と「A9の色」が一致した数が「A2」に表示されます。
108
+ 「範囲B1:B31のセルの色」と「G11の色」が一致した数が「H11」に表示されます。
65
109
 
66
110
  ```Excel
67
111
 
68
- =countCellsWithBackgroundColor(getBackgroundColor("A9"), "C1:C31")
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

参考リンクの修正

2020/05/13 02:33

投稿

Risney
Risney

スコア148

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

内容の修正

2020/04/24 06:35

投稿

Risney
Risney

スコア148

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(JavaScript)
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
- //https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
57
+ function onEdit(event) {
60
- //シートID 1Absxwsnc1VyxCP7CLoTkTl2twWJuQcSHLd7OHNmJusg
58
+ // ここに編集したシートを更新する処理をいれる?
59
+ }
60
+ }
61
+ ```
61
62
 
62
- //トリガー https://webbibouroku.com/Blog/Article/gas-event-cell#outline__2
63
+ 以下の関数をExcelのA2セルに挿入しています。
63
- //http://madachugakusei.hatenablog.com/entry/2015/10/18/140439
64
- //https://teratail.com/questions/21724
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
- // onEdit Event
74
+ onEditメソッド内に以下の文章を入れたところ、
75
+ 編集したセルに最終更新日時がメモとして挿入されたのを確認しているので、
76
+ onEditのメソッドの挙動は問題ないと思います。
77
+ ```GoogleAppScript
68
- function onEdit(event) {
78
+ function onEdit(e){
69
- // 編集のあったシート
70
- var ss = event.source.getActiveSheet();
71
- var range = ss.event.range;
79
+ var range = e.range;
72
80
  if(range.getColumn() == 1){
73
- range.setNote('変更しました');
81
+ range.setNote('Last modified: ' + new Date());
74
82
  }
75
83
  }
76
84
  ```
77
85
 
78
- ### 試したこと
86
+ ### 懸念点
79
87
 
80
- onEditメソッド
88
+ 毎回編集する度に更新だと以下の点が気になります。
89
+ ・同時に2つのセルをコピペなどで編集した場合どうなるのか?
90
+ ・毎回更新していたら作業が進みにくそうなので、ボタンなどのトリガーで起動したほうがよい?
81
91
 
82
- ### 補足情報(FW/ツールのバージョンなど)
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