質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

1241閲覧

複数シートある場合のアクティブシートに応じた処理を行わせるGAS

0000a

総合スコア18

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2021/10/01 12:38

シート1、シート2、シート3という三つのシートがあり、それぞれのシートごとに別の処理を想定しており、アクティブシートに応じて、対応する処理を実行後、その後に共通の処理をした結果をシート4に反映したいと考えています。

(実行時は、三つの処理のうちアクティブシートに対応した一つが実行され、その後、シートによらない共通の処理が一回実施されるイメージです)

上記を実装できるGASの構文の枠組みをどなたかお教えいただけませんでしょうか?
{}は各処理が入るイメージです お手数ですがご教示いただけますと幸いです

function test() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1");{}

var sheet = ss.getSheetByName("シート2");{}

var sheet = ss.getSheetByName("シート3");{}

var sheet = ss.getSheetByName("シート4");{}}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/01 12:51 編集

「アクティブシートに応じて、対応する処理を実行後、」や「実行時は、三つの処理のうちアクティブシートに対応した一つが実行され...」という文の「対応する処理」「実行時」について、 そもそも、どのようにして実行を開始する想定なのでしょうか? たとえば... ・あるスプレッドシート内に、シート1、シート2、シート3、シート4 という4つのシートがあり、 ・それぞれのシートに図形描画で作った四角形のボタンが作ってあり ・ユーザーが各シートのボタンを押したとき に、それぞれのシートに応じた処理をさせたい、ということなのでしょうか?
0000a

2021/10/01 13:41

ご回答ありがとうございます。イメージはご高察の通りです。 現状はご指摘いただいた通りボタンが各シートに設置されており、これを押すことで処理自体はできています。主にコードをスッキリさせたいという趣旨にはなります。 最終的には、function onOpen(e){ を使ってメニューに表示させた上で、アクティブシート及びセルの値に応じ、アクティブシートに応じた処理をしたいと考えております。
0000a

2021/10/01 13:45

var ss = SpreadsheetApp.getActiveSpreadsheet(); var cell = ss.getActiveSheet().getActiveCell(); if (cell.getColumn() != 1) { var row = cell.getRow(); var column = cell.getColumn(); 自分でも検討中であるのですが、これによってアクティブシートのアクティブセルの番地を手に入れています。シートに応じてrow,columnの処理を分けたいのですが、その書き分けをご教示いただきたいと思います 例えば、アクティブシートがシート1ならば var value1 = cell.offset((row-1)*(-1),0).getValue(); アクティブシートがシート3ならば var value1 = cell.offset((row-1)*(-1),(column-1)*(-1)).getValue(); といったふうに処理が分かれるコードをお教えいただけますと幸いです。
guest

回答1

0

ベストアンサー

単純に、 ss.getActiveSheet().getSheetName() でシート名を取得し、
if文かswitch文で、シート名に応じて処理を分けるというのではだめなのでしょうか。

const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = ss.getActiveSheet(); const activeSheetName = activeSheet.getSheetName(); const sheet4 = ss.getSheetByName('シート4'); // 各シートのボタンに紐付けているスクリプトは、myFunction(共通) function myFunction() { let values = null; // シート名に応じて処理を分ける switch (activeSheetName) { case 'シート1': // シート1の処理 values = activeSheet.getRange("A1:D3").getValues(); break; case 'シート2': // シート2の処理 values = activeSheet.getRange("E1:H3").getValues(); break; case 'シート3': // シート3の処理 values = activeSheet.getRange("A10:D12").getValues(); break; default: // activeSheetNameが「シート1」「シート2」「シート3」以外の場合、何もしない。 return; } // シート4に対して共通処理を行う if (values != null) { sheet4.getRange("C3:F5").setValues(values); // ~~ } }

コメント中のコードの修正ですが、下記のようになります。
(先頭が「+」となっている行は追加、「-」となっている行は削除)

diff

1function 無題() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 4 var sheet = ss.getSheetByName("展開"); 5 sheet.getRange(1, 1).setValue("日付"); 6 sheet.getRange(1, 2).setValue("会社名"); 7 sheet.getRange(1, 3).setValue("No"); 8 9 10 var sheet0 = ss.getActiveSheet(); 11 var cell = sheet0.getActiveCell(); 12 13 if (cell.getColumn() != 1) { 14 var row = cell.getRow(); 15 var column = cell.getColumn(); 16 17- function myFunction() { // ここでは不要。 18- let values = null; // 変数valuesは下記caseの中では使用していないので不要 19- switch (sheet0) { // シートオブジェクトでswitchしてしまっているためNG。 20+ switch (sheet0.getSheetName()) { // ここではシート名でswitchするのが正しい。 21 case "T/B": 22 var value1 = cell.offset((row-1)*(-1),0).getValue(); 23 var value2 = cell.offset(0,(column-1)*(-1)+2).getValue(); 24 sheet.getRange(1, 1).setValue(value1); 25 sheet.getRange(1, 4).setValue(value2); 26 sheet.getRange(1, 12).setValue(value2); 27 break; 28 29 case "消費税": 30 var value3 = cell.offset((row-1)*(-1),0).getValue(); 31 var value4 = cell.offset(0,(column-1)*(-1)+2).getValue(); 32 var value5 = cell.offset(0,(column-1)*(-1)+1).getValue(); 33 34 sheet.getRange(1, 1).setValue(value3); 35 sheet.getRange(1, 7).setValue(value4); 36 sheet.getRange(1, 15).setValue(value4); 37 sheet.getRange(1, 2).setValue(value5); 38 break; 39 40 } 41 } 42 43 sheet.getRange("A1").activate(); 44 45-}} // 「myFunction{」に対応する 「}」を削除 46+}

今回は、無題()関数の中に、さらに関数myFunctionを入れる必要はないので、function myFunction{と対応する}の行を削除しています。

注意:switch文を使う場合、各処理の終わりのbreakを忘れないでください。
break文を適切な場所に書いていないと、次の処理まで実行されてしまいます。
(break文を忘れるリスクがあるため、switchは非推奨とし、代わりにif~else文や、関数の連想配列を使用すべき、としている説明もあります)

投稿2021/10/01 14:06

編集2021/10/03 00:08
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0000a

2021/10/02 00:07 編集

ありがとうございます。現状では、以下のようなものを想定しておりますが、うまくいきません。。 function 無題() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("展開"); sheet.getRange(1, 1).setValue("日付"); sheet.getRange(1, 2).setValue("会社名"); sheet.getRange(1, 3).setValue("No"); var sheet0 = ss.getActiveSheet(); var cell = sheet0.getActiveCell(); if (cell.getColumn() != 1) { var row = cell.getRow(); var column = cell.getColumn(); function myFunction() { let values = null; switch (sheet0) { case "T/B": var value1 = cell.offset((row-1)*(-1),0).getValue(); var value2 = cell.offset(0,(column-1)*(-1)+2).getValue(); sheet.getRange(1, 1).setValue(value1); sheet.getRange(1, 4).setValue(value2); sheet.getRange(1, 12).setValue(value2); break; case "消費税": var value3 = cell.offset((row-1)*(-1),0).getValue(); var value4 = cell.offset(0,(column-1)*(-1)+2).getValue(); var value5 = cell.offset(0,(column-1)*(-1)+1).getValue(); sheet.getRange(1, 1).setValue(value3); sheet.getRange(1, 7).setValue(value4); sheet.getRange(1, 15).setValue(value4); sheet.getRange(1, 2).setValue(value5); break; }}  sheet.getRange("A1").activate(); }}
0000a

2021/10/02 00:08 編集

シート(T/B、消費税)ごとに既に表が作成されており、アクティブシートの特定のセルを起点として、rowやcolumnを用いて特定の場所の番地を取得(表の行列を示す番地)して、これを展開というシートのそれぞれの特定場所にコピペさせ、最後に展開シートにアクティブセルを移動する(上記で共通の処理といったいた部分 sheet.getRange("A1").activate(); )、ということがやりたい感じです。
退会済みユーザー

退会済みユーザー

2021/10/02 02:15 編集

上のコメントのコードの修正を、回答欄に記載しました。 なお、もしも、回答欄に記載したコードについて、内容変更や機能追加要望がある場合は、このコメントに続けるのではなく、別途あらたに質問を立てていただきますようお願いいたします。
0000a

2021/10/02 04:09

ありがとうございます、アクティブシートに沿って処理が分岐されるようになりました、助かりました ただ、動作が遅くなった感じがするのですがこれは仕方ないのでしょうか?(caseは実際は5、6個あり、 sheet.getRange("A1").activate(); 以下にも処理が続きます。)
退会済みユーザー

退会済みユーザー

2021/10/02 04:27

>「動作が遅くなった感じがするのですがこれは仕方ないのでしょうか?」 その、本当に申し訳ないのですけれど、 「遅くなる前の、caseが5、6個ある元のコード」と、「私の後半の回答をもとに修正されたであろう貴方様のコード」が全く明らかにされていない状態で、 遅くなった原因などわかるはずもありません。(比較のしようがありません) 私の回答例は手元で動作することは確認していますが、その中に、特に動作を遅くさせる要素はないと思います。 (そもそもデータの数自体が異なる可能性もありますが、実際にどのようなデータが各シートにどれくらいあって、具体的にどのような加工処理を行っているの自体、明らかにされてないのでわかりかねます。 もし遅くなった原因をお知りになりたければ、そのデータや修正前後のコード・シート画像・説明等をすべて質問文に記載した上で改めて質問を立ててください。)
0000a

2021/10/02 13:04

ご返信ありがとうございます。Caseに、さらにシートとコードを追加しますと、読み取るセルの番地がおかしくなってしまう事象になってしまいました、、改めて現状のコードを記載した質問を改めて立てさせていただきましたので大変お手数ですが、ご教示いただけますでしょうか?
0000a

2021/10/02 13:07

データ自体なのですが、会計帳簿になりますので、あまり具体的な取引先名等を出せない事情がございますことをご了承ください、また、その関係でそれなりに重いと思います 数MB〜100MBを超えることがございます。
退会済みユーザー

退会済みユーザー

2021/10/03 00:10 編集

switchに関する注意を追記しました。 完全に推測ですが、修正前に比べて修正後に時間がかかるようになった原因は、breakを忘れていて処理を複数回行っていたからではないでしょうか。
0000a

2021/10/03 02:18

追記含め、勉強になりました。速度の件ですが、私の思い違いかもしれません、おっしゃる通り複数回無駄な処理がから回っていたかもしれません。色々とありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問