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

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

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

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

Q&A

1回答

1251閲覧

GASでVlookUP機能を実装

Tatsu-0811

総合スコア1

Google Apps Script

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

0グッド

1クリップ

投稿2023/03/12 06:22

実現したいこと

あるスプレッドシートのタブから、他のタブにVLOOKUP関数を適用した時のような形でデータを転記したい。

前提

GASでスプレッドシートを処理するコードを書いていますが、元は3列分のデータだけを転記したいのですが、全部の配列データを返してしまい、うまく転記することができません。

エラーメッセージ

該当のソースコード

GAS

1ソースコード

function MyVLOOKUP_B() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const SearchSheet = ss.getSheetByName('〇〇');
const LastRow = SearchSheet.getLastRow();
const ListSheet = ss.getSheetByName('△△');
const DataSheetValues = ss.getSheetByName('△△').getDataRange().getValues();
const Key = [];
const Data = [];

// キーと返したいデータを配列に格納
for (let i = 1; i < DataSheetValues.length; i++){
Key.push(DataSheetValues[i][4]);
Data.push(DataSheetValues[i][10]);//この10、11、12をSearchSheetの所定の列にKeyに対応する形で転記したいと思っています。
Data.push(DataSheetValues[i][11]);
Data.push(DataSheetValues[i][12]);
}

// 検索キーを取得し、対応したデータを返す
let SearchKey = SearchSheet.getRange(2,3,LastRow - 1,8).getValues();

for (let i = 1; i < SearchKey.length; i++){
SearchKey[i][3] = Data[Key.indexOf(SearchKey[i][0])];
SearchKey[i][4] = Data[Key.indexOf(SearchKey[i][1])];
SearchKey[i][5] = Data[Key.indexOf(SearchKey[i][2])];
}

console.log(SearchKey)

// 対応データの入った配列「SearchKey」をシートに書き込む
SearchSheet.getRange(2,6,LastRow - 1,8).setValues(SearchKey);
}

試したこと

いろいろ試していますが、
for (let i = 1; i < SearchKey.length; i++){
SearchKey[i][3] = Data[Key.indexOf(SearchKey[i][0])];
SearchKey[i][4] = Data[Key.indexOf(SearchKey[i][1])];
SearchKey[i][5] = Data[Key.indexOf(SearchKey[i][2])];
}
の部分のコードの内容をよく理解できず、うまく処理することができません。キーと返したいデータを配列に格納するところまでは上手くできています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

1T2R3M4

2023/03/12 07:19 編集

>部分のコードの内容をよく理解できず とありますが、Tatsu-0811さんはどのような動作をさせるために そう書いたのですか。適当に書いたってことですか。
Tatsu-0811

2023/03/12 10:59

1T2R3M4様 コメントありがとうございます。 ネットで記載してあったコードを修正して作成しようと思い、コピってきたコードを修正してコードを記述しました。 他にも似たようなコードを作成し、データが1列であれば無事上手く動作させることができましたが、複数列になると上手くいきませんでした。 何度も修正したりしましたが上手くいかなかったのでお伺いしている次第です。 よろしくお願いします!
guest

回答1

0

現在のコードは、forループでKeyとData配列に値を格納していますが、その後forループでSearchKeyの各セルに対応するデータを探しているため、全てのKeyとData配列の値を探しに行っています。そのため、全ての値が返されてしまい、うまく転記することができないのです。

改善策としては、forループで各行のデータのみを取り出して、その行に対応するKeyとData配列の値を探すようにすると、期待した動作ができるようになります。

以下は、修正例のコードです。修正部分はforループの中身と、KeyとDataの配列格納箇所です。

function MyVLOOKUP_B() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const SearchSheet = ss.getSheetByName('〇〇');
const LastRow = SearchSheet.getLastRow();
const ListSheet = ss.getSheetByName('△△');
const DataSheetValues = ss.getSheetByName('△△').getDataRange().getValues();

// 検索キーを取得し、対応したデータを返す
let SearchKey = SearchSheet.getRange(2,3,LastRow - 1,8).getValues();

for (let i = 0; i < SearchKey.length; i++){
let Key = DataSheetValues.map(function(value,index) {return value[4]});
let Data = DataSheetValues[i].slice(10,13);
SearchKey[i][3] = Data[Key.indexOf(SearchKey[i][0])];
SearchKey[i][4] = Data[Key.indexOf(SearchKey[i][1])];
SearchKey[i][5] = Data[Key.indexOf(SearchKey[i][2])];
}

console.log(SearchKey)

// 対応データの入った配列「SearchKey」をシートに書き込む
SearchSheet.getRange(2,6,LastRow - 1,8).setValues(SearchKey);
}
修正点としては、forループの中でKeyとData配列を新たに定義し、それぞれDataSheetValuesの中から対応する部分を取り出しています。また、Key.indexOf()の引数をSearchKey[i][0]のように1つの値にしています。これによって、SearchKeyの1行目から順に検索していくため、全ての値を取り出してしまうことがなくなります。

投稿2023/03/12 10:35

編集2023/03/12 10:36
quiz

総合スコア258

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

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

Tatsu-0811

2023/03/12 12:27

こんばんわ。 ご回答ありがとうございます。 コードの内容については理解できませんでしたが試してみたところ、ちゃんと3列分のデータが格納されることを確認しました! 有難うございます。 しかしながら、DATAの中身が代入されたわけではなく、SearchKeyの中身を 見てみたところ、let SearchKey = SearchSheet.getRange(2,3,LastRow - 1,8).getValues(); で取得されたデータが格納されているようで何が起きているのか、よく理解できませんでした。 どうすればDATAの中身をSearchSheetの3~5列に記載できるのでしょうか。 お手数ですが、何卒ご確認のほどよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問