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

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

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

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

受付中

GASを使用した条件分岐によるデータ貼り付けしたあとプルダウン作成を追加したい

tkt1964
tkt1964

総合スコア5

Google Apps Script

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

1回答

0評価

1クリップ

176閲覧

投稿2022/05/16 15:33

編集2022/05/20 06:35

前提

スプレッドシートに入力した内容から
別シートの対照表を基にデータの貼り付けとプルダウンの選択肢を表示させたい

実現したいこと

・スプレッドシート上で既に設定したプルダウンを選択、その内容を基に別シートの対照表の最初に該当するデータを貼り付け
・貼り付けたセルにプルダウンを作成
・作成されたプルダウンの内容は別シートの対照表を参照
・貼り付ける/プルダウンを作成される列は6列(B列で項目選択、C~H列にプルダウン作成)

発生している問題

以前ここで回答いただいた下記、コードで
基準となる情報を”使用シート”で選択すると
その隣の列へ”設定シート”の対照表を基に”使用シート”上にプルダウンが作成されます。

今回したいのは、プルダウントと貼り付けになります。

<使用シート>
B列      C列      D列・・・
データ1    ①←貼り付け  ③←貼り付け
(プルダウン)  (プルダウン)  (プルダウン)

A列:空白(他データを入れるため)  
B列:このシート上で選択
C列:GASで”設定シート”の対照表のB列を基にプルダウン作成
D列:GASで”設定シート”の対照表のC列を基にプルダウン作成

”設定シート”
A列      B列      C列      D列・・・
データ1    ①       ③       ④
データ1    ②       ④       ④
データ2    ③       ⑤       ⑥ 
データ2    ③       ⑤       ⑦

該当のソースコード

GAS

/** * ①グローバル変数の定義 */ const USE_SHEET_NAME = "使用シート"; const SETTING_SHEET_NAME = "設定シート"; const CATEGORY1_COL_NUM = 2; // B列 /** * ②本体 */ function onEdit(e) { if (!isTargetCol(e)) return; const category1Value = e.value; const changedRow = e.range.getRow(); const changedCol = e.range.getColumn(); const useSheet = e.source.getSheetByName(USE_SHEET_NAME); // 設定シート のデータ(二次元配列) const settingData = e.source.getSheetByName(SETTING_SHEET_NAME).getDataRange().getValues(); // 編集されたセルの右のセルにカテゴリ2のプルダウンをセットする for (let i = 1; i <= 6; i++) { const range = useSheet.getRange(changedRow, changedCol + i); const rule = getRule(category1Value, settingData, i); if (rule == null) continue; range.setDataValidation(rule); } } //追加箇所 function getRule(category1Value, settingData, column) { // カテゴリ1に対応するカテゴリ2を入れておくところ let catgory2List = []; // 設定シート のデータの中から、「選択されたカテゴリ1」に対応するカテゴリ2を取り出すところ settingData.forEach(row => { if (row[0] === category1Value) { catgory2List.push(row[column]); } }); if (catgory2List.length === 0) return; // 編集されたセルの右以降のセルにカテゴリ2のデータを貼り付ける const rule = SpreadsheetApp.newDataValidation().requireValueInList(catgory2List, true); rule.editsheet.appendRow(catgory2List); return rule; } //追加箇所 function getRule(category1Value, settingData, column) { // カテゴリ1に対応するカテゴリ2を入れておくところ let catgory2List = []; // 設定シート のデータの中から、「選択されたカテゴリ1」に対応するカテゴリ2を取り出すところ settingData.forEach(row => { if (row[0] === category1Value) { catgory2List.push(row[column]); } }); if (catgory2List.length === 0) return; // 編集されたセルの右以降のセルにカテゴリ2のプルダウンをセットする const rule = SpreadsheetApp.newDataValidation().requireValueInList(catgory2List, true); rule.setAllowInvalid(false).build(); return rule; } /** * ⑦プルダウン連動をさせる列かどうかの判断 */ function isTargetCol(e) { // 値が削除されたときはvalueが undefになるので無視 if (!e.range.getValue()) return false; // ※1 // 関係ないシートのとき if (e.source.getSheetName() !== USE_SHEET_NAME) return false; // 列が違うとき if (e.range.getColumn() != CATEGORY1_COL_NUM) return false; return true; }

試したこと

プルダウンをセットする前に、貼り付けするコードを入れてみましたが
エラーが出てしまい、こちらに再度ご質問させていただきました。

追加箇所に二次元配列のデータを貼り付けるコードを入れてみましたが
上手く作動しません。
入力してもデータ貼り付けなし、プルダウン作成もしなくなりました。

お手数ですが、ご尽力いただければ幸いです。
何卒宜しくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

k.a_teratail

2022/05/17 02:32

> エラーが出てしまい どのようなエラーが表示されたのでしょうか?
tkt1964

2022/05/17 07:57

ご質問ありがとうございます。 あれから、自分で編集し直してみまして //~プルダウンをセットする 内に setValuesを入れて、エラー自体は発生しなくなったのですが 動作自体しなくなってしまいました。
k.a_teratail

2022/05/17 09:52

> エラー自体は発生しなくなったのですが > 動作自体しなくなってしまいました。 console.log()などを入れて、どこで終了しているか確認するのはどうでしょうか?
k.a_teratail

2022/05/17 10:33 編集

追加で、「getRule」の関数が二つあります。 これのせいで、期待している結果にならないとかでは無いでしょうか? 同じ関数名がある場合、後に定義された関数で実行されます。 ---------------------------- function myFunction1() { aaa() } function aaa() { console.log("先") } function aaa() { console.log("後") } ---------------------------- 実行ログ 19:32:45 情報 後 ----------------------------

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

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