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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

217閲覧

シートBに入力された値をシートAに反映させる方法(シート名の変動あり)

maruo_marui

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/10/07 04:57

編集2022/10/07 05:01

GAS初心者です。
拙い質問・情報不足な部分があるかと思いますが、何卒ご容赦ください。

前提

【使用するシート】
・シートA(スケジュール表、1日の流れが全て記載されている)
・シートB(シートAと同じスケジュール表で、時間帯に分けて表示できる機能付き)
→シートAがかなり縦に長いので、シートAで全体の流れを把握しながら、実際の業務はシートBを見て進める。

【状況】
今回作成するのはシートA、シートBのテンプレです。
各事業所で担当者名を変更する必要があるため、各事業所でテンプレをコピーして別のシートに移し、シート名を変更して使用する予定です。

【やりたいこと】
・シートAに入力された担当者名をシートBに自動反映する

【質問内容】
テンプレだけであれば、シートAが編集された際にgetSheetByNameを使用してsetValueするトリガーを設定すればうまくいったのですが、実用するにあたり各営業所ごとにシート名を変更されてしまうため、getSheetByNameがうまく使えず困っております。
以下の工夫をしてみましたがどうにもうまくいかず、こちらでご質問いたしました。
・シート名が変更されても判別できるよう、下記の値を入れている
シートA:E1セルに「全体スケジュール」
シートB:E1セルに「個別スケジュール」
・変更したシートBのシート名を入力する欄を、シートAのE2セルに作成している
→そこから値を取得すれば動かせるかと思いましたがうまくいきませんでした。

実現したいこと

  • シートAの担当者名(B6:F6)をシートB(B6:F6)に自動反映させる
  • シート名が変更されても動くようにする

発生している問題・エラーメッセージ

・シート名が変更された際にgetSheetByNameが作用しない

該当のソースコード

やりたいことをgetSheetByNameを用いて作成したのが以下のコードです。

GAS

1function getName() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sh = ss.getActiveSheet();//シートAです 4 var ce = sh.getRange("E1"); 5 var va = ce.getValue(); 6 7 if(va === "全体スケジュール"){ 8 var sheet = ss.getSheetByName('シートB'); 9 var ce2 = sheet.getRange("E1"); 10 var va2 = ce2.getValue();// 11 12 if(va2 === "個別スケジュール"){ 13 var ce4 = sh.getRange("B6:F6"); 14 var getManager = ce4.getValues(); 15 var cell2 = sheet.getRange("B6:F6"); 16 cell2.setValues(getManager); 17 } 18}

解決策をご教授いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

Cocode

2022/10/07 05:06

確認失礼します🙇 私の理解力が足らず、運用方法があまりわかっておりません… ・担当者一人につき、1つのスプレッドシート ・スプレッドシートの中には、シートAとシートB ・シートAの名前は、担当者によって変更される可能性が高い ・シートBの名前は、変わらない ・シートAに入力されたら、シートBに自動で反映される ということでしょうか?
maruo_marui

2022/10/07 06:12 編集

ご連絡ありがとうございます。 また、拙い表記で伝わりにくい内容となっており申し訳ございません。 運用方法ですが、 ・営業所1箇所につき、1つのスプレッドシート(東京営業所、大阪営業所……とそれぞれ1シート) ・スプレッドシートの中には、シートAとシートBがあります(営業所によっては他の全く関係ないシートを追加する可能性もあり得ます) ・シートA、シートBともに担当者によってシート名が変更される可能性が高いです(シートA→東京営業所スケジュール など) ・シートAに担当者名が入力されたら、シートBの担当者名のところにも自動で反映されるようにしたいです(シートの形式自体は同じなので、それぞれB6:F6に名前が入ります) 上記で伝わりますでしょうか🙇‍♀️
guest

回答1

0

ベストアンサー

・シート名が変更されても判別できるよう、下記の値を入れている
シートA:E1セルに「全体スケジュール」
シートB:E1セルに「個別スケジュール」

ということなので、まずは上記のセルを保護して編集できないようにしておきます。

特定のシートやセルは編集させない! スプシの共有ファイルの編集範囲を制限する方法 - 窓の杜

あとは、forループで全シートのE1セルの値を調べて、「全体スケジュール」「個別スケジュール」のシートを変数(sh1, sh2)に格納します。
後は、sh1 から sh2 へ転記するコードを記述すればいいでしょう。

JavaScript/GAS

1function test() { 2 let sh1, sh2; 3 let sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 4 for (sheet of sheets) { 5 let va = sheet.getRange("E1").getValue(); 6 if (va === "全体スケジュール") { 7 sh1 = sheet; 8 } else if (va === "個別スケジュール") { 9 sh2 = sheet; 10 } 11 } 12 //確認用 13 Logger.log((sh1.getName()); 14 Logger.log((sh2.getName()); 15 16 //転記処理 17 let getManager = sh1.getRange("B6:F6").getValues(); 18 sh2.getRange("B6:F6").setValues(getManager); 19};

投稿2022/10/07 08:27

hatena19

総合スコア33715

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

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

maruo_marui

2022/10/11 05:27

上記コードで解決いたしました! 本当に助かりました、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問