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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

204閲覧

2枚のスプレッドシートで複数の条件を追加し情報を抽出したい。

Sunny-o-

総合スコア0

Google Apps Script

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2024/10/25 09:31

実現したいこと

2枚のスプレッドシートで複数の条件を追加し情報を抽出したい。

前提

以下の条件で情報を抽出したい場合、どのようなGASを使用すべきでしょうか。
・シート2のAH列とシート3のF列の情報が完全一致
・シート2のC列とシート3のG列の情報が完全一致
・シート3のH列に10月1日から10月31日までの期間を含む年月が記載されている
・シート3のI列に10月1日から10月31日までの期間を含む年月が記載されている
上記が一致した場合
・シート2のG列にシート3のH列を書き込み
・シート2のH列にシート3のI列を書き込み
・シート2のBC列にシート3のA列を書き込み
・同じ条件が複数あった場合は同じ条件の行のすぐ下に行を一行追加して書き込み
・それ以外の場合は空白

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

エラーも表示されず、書き込みもされずでした。

エラーメッセージ

該当のソースコード

function transferDataWithLinelnsertion(){ const ss = SpreadsheetApp.getActiveSpreadsheet); const sheet2 = ss.getsheetByName(シート2);//シート2の名前を指定 const sheet3 = ss.getsheetByName(シート3);//シート3の名前を指定 //シートデータの取得 const data2 = sheet2.getDataRange().getValues(); const data3 = sheet3.getDataRange().getValues(); //シート2のデータを処理 for (leti= 1; i< data2.length; i++){ //更新する行 const ahVal= data2[i][32];//シート2のAH列 const cVal= data2[i][2];//シート2のC列 let insertCount = 0; //挿入された行数をカウント for (let j = 1; j < data3.length; j++){// シート3の各行を確認 const fVal = data3[j][5];//シート3のF列 const gVal = data3[i][6];//シート3のG列 const hVal = data3[i][7];//シート3のH列 const iVal = data3[i][8];//シート3のI列 const aVal= data3[i][0];//シート3のA列 //条件を確認 if (ahVal === fVal && cVal === gVal) { //行を追加してデータを書き込む sheet2.insertRowAfter(i+insertCount);//現在の行のすぐ下に行を挿入 sheet2.getRange(i + insertCount + 1, 7).setValue(hVal); sheet2.getRange(i + insertCount + 1, 8).setValue(iVal); sheet2.getRange(i + insertCount + 1,55).setValue(aval); insertCount++;//挿入された行数を増やす } } //一致しなかった場合は空白を設定 if (insertCount === 0) { sheet2.getRange(i + 1, 7).setValue("); sheet2.getRange(i + 1, 8) .setValue("); sheet2.getRange(i + 1, 55) .setValue("); } } }

試したこと

3パターンぐらい書き出しましたが結果どれも同じく何も書き込みもされませんでした。
大変お手数をおかけいたしますが、どなたかお力をお貸しいただけますと幸いです。
何卒よろしくお願いいたします。

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

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

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

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

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

YellowGreen

2024/10/25 12:03

const fVal = data3[j][5];//シート3のF列 const gVal = data3[i][6];//シート3のG列 const hVal = data3[i][7];//シート3のH列 const iVal = data3[i][8];//シート3のI列 const aVal= data3[i][0];//シート3のA列 上は実際のコードからのコピペでしょうか それとも転記誤りでしょうか?
Sunny-o-

2024/10/25 12:41

ご返信ありがとうございます。 実際のコードからのコピペです。 GASを初めて触りました。何があってて何が間違っているのかまだわかりません。 ご教授いただけますと幸いです。
jimbe

2024/10/25 13:35

java は関係ありませんのでタグを外して頂いたほうが良いと思います。
Sunny-o-

2024/10/25 14:17

ありがとうございます。 恐らく外れたかと思います。
jimbe

2024/10/26 03:39

>恐らく外れたかと思います。 いえ、外れていないようです・・・ご自身でも確認出来るはずです。 まぁ何か致命的な問題があるわけでもありませんので、お時間ある時にでもまた試して頂ければと思います。
guest

回答2

0

YellowGreenさんにコメントいただいているように
data3[i][...]としている個所は、外側のループのインデックス i を参照しており、
正しくはdata3[j][...]だと思います。
あとAH列はおそらく34列目ですね。

あとはサンプルコードではgetsheetByNameとなっている箇所は、
おそらくgetSheetByNameだったり全角半角が入り混じって居たりと
そのままでは動きそうになかったです。

あと日付の判定の処理も入ってなかったようだったので
追加して処理を記述してみました。
処理もあまり想像がつかなかったので、ログを入れながら動かしてみました。
たぶん動くとは思います。

エラーも表示されず、書き込みもされないとのことだったので、
特に開発中は処理がどこまで正しいのかログで出すか、
デバッグ機能(遅いですが)を使ってみるなどして、
変数に想定通りの値が入っているかを確認しながら進めると間違いないかなと思います!

javascript

1function transferDataWithLineInsertion(){ 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet2 = ss.getSheetByName('シート2'); // シート2の名前を指定 4 const sheet3 = ss.getSheetByName('シート3'); // シート3の名前を指定 5 6 // シートデータの取得 7 const data2 = sheet2.getDataRange().getValues(); 8 const data3 = sheet3.getDataRange().getValues(); 9 10 // 期間を設定 (2024年10月1日から2024年10月31日まで) 11 const startDate = new Date('2024-10-01'); 12 const endDate = new Date('2024-10-31'); 13 14 Logger.log(`開始日: ${startDate}, 終了日: ${endDate}`); 15 16 // シート2のデータを処理(下から上へ) 17 for (let i = data2.length - 1; i >= 1; i--) { // ヘッダー行を除く 18 const ahVal = data2[i][33]; // シート2のAH列 (34列目) 19 const cVal = data2[i][2]; // シート2のC列 (3列目) 20 let insertCount = 0; // 挿入された行数をカウント 21 22 Logger.log(`\nシート2の${i + 1}行目を処理中: AH=${ahVal}, C=${cVal}`); 23 24 for (let j = 1; j < data3.length; j++) { // シート3の各行を確認 25 const fVal = data3[j][5]; // シート3のF列 (6列目) 26 const gVal = data3[j][6]; // シート3のG列 (7列目) 27 const hVal = data3[j][7]; // シート3のH列 (8列目) 28 const iVal = data3[j][8]; // シート3のI列 (9列目) 29 const aVal = data3[j][0]; // シート3のA列 (1列目) 30 31 Logger.log(` シート3の${j + 1}行目と比較中: F=${fVal}, G=${gVal}, H=${hVal}, I=${iVal}, A=${aVal}`); 32 33 // 条件を確認 34 if (String(ahVal) === String(fVal) && String(cVal) === String(gVal)) { 35 Logger.log(` -> 一致しました。`); 36 37 // H列とI列の日付をDate型に変換 38 const hDate = new Date(hVal); 39 const iDate = new Date(iVal); 40 41 Logger.log(` 変換した日付: H=${hDate}, I=${iDate}`); 42 43 // 日付が期間内にあるか確認 44 if (hDate >= startDate && hDate <= endDate && iDate >= startDate && iDate <= endDate) { 45 Logger.log(` 日付が期間内です。シート2の${i + insertCount + 1}行目にデータを挿入します。`); 46 47 // 行を追加してデータを書き込む 48 sheet2.insertRowAfter(i + insertCount); // 挿入する位置を調整 49 sheet2.getRange(i + insertCount + 1, 7).setValue(hVal); // G列(7列目) 50 sheet2.getRange(i + insertCount + 1, 8).setValue(iVal); // H列(8列目) 51 sheet2.getRange(i + insertCount + 1, 55).setValue(aVal); // BC列(55列目) 52 insertCount++; // 挿入された行数を増やす 53 } else { 54 Logger.log(` 日付が期間外です。`); 55 } 56 } else { 57 Logger.log(` -> 一致しません。`); 58 } 59 } 60 61 // 一致が見つからなかった場合は空白を設定 62 if (insertCount === 0) { 63 Logger.log(` 一致が見つかりませんでした。シート2の${i + 1}行目のG列、H列、BC列を空白に設定します。`); 64 sheet2.getRange(i + 1, 7).setValue(""); 65 sheet2.getRange(i + 1, 8).setValue(""); 66 sheet2.getRange(i + 1, 55).setValue(""); 67 } 68 } 69}

投稿2024/10/25 13:38

dadadaiiiiiii

総合スコア49

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

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

Sunny-o-

2024/10/25 14:18

夜分遅くに失礼いたします。 明日ご教授いただきました内容にて試してみたいと思います! またご連絡させてください。
guest

0

既に回答があるので、
こちらは参考程度にしていただければと思います

JavaScript

1// シート2とシート3とで反服処理が繰り返されることを避けて 2// シート3の照合用辞書を生成して照合を省力化 3// シートへの記入も列ごとに配列から一括して行う 4function transferDataWithLinelnsertion() { 5 // 初期設定(シート名、日付、列番号) 6 const sheetName2 = 'シート2'; 7 const sheetName3 = 'シート3'; 8 const termStart = '2024/10/01'; 9 const termEnd = '2024/10/31'; 10 const column = { 11 a: 1, 12 c: 3, 13 f: 6, 14 g: 7, 15 h: 8, 16 i: 9, 17 ah: 34, 18 bc: 55, 19 }; 20 21 // 期間の日付、配列のインデックスなどの条件を生成 22 const startDate = new Date(termStart); 23 const endDate = new Date(termEnd); 24 const index = {}; 25 for (const col in column) { 26 index[col] = column[col] - 1; 27 }; 28 29 // 各シートからデータを取得 30 const ss = SpreadsheetApp.getActiveSpreadsheet(); 31 const sheet2 = ss.getSheetByName(sheetName2); 32 const sheet3 = ss.getSheetByName(sheetName3); 33 const data2 = sheet2.getDataRange().getValues(); 34 const data3 = sheet3.getDataRange().getValues(); 35 36 // シート3のデータから照合用辞書を生成 37 // 辞書のキー: F列の値 + '_$_' + G列の値 38 // 辞書の値(配列): [{a: A列の値, h:H列の値, i:I列の値}, {a: A列の値, h:H列の値, i:I列の値}, {...}, ...] 39 // 同じキーを持つ値が複数あるときは、配列の要素に加える 40 const mapData = new Map(); 41 for (const v of data3) { 42 // 期間外のデータは除外 43 if (new Date(v[index.h]) < startDate || 44 new Date(v[index.i]) > endDate) { 45 continue; 46 } 47 // 辞書にデータを登録 48 const key = v[index.f] + '_$_' + v[index.g]; 49 const value = { 50 a: v[index.a], 51 h: v[index.h], 52 i: v[index.i], 53 }; 54 if (!mapData.has(key)) { 55 mapData.set(key, [value]) 56 } else { 57 const values = mapData.get(key); 58 values.push(value); 59 } 60 } 61 62 // シート2のデータを辞書と照合して、シートに記入する値を配列に蓄積 63 const data = { 64 bc: [], 65 g: [], 66 h: [], 67 }; 68 let rowsCount = 0; 69 data2.forEach((v, i) => { 70 const key = v[index.ah] + '_$_' + v[index.c]; 71 if (mapData.has(key)) { 72 // マッチした場合 73 const values = mapData.get(key); 74 values.forEach((value, n) => { 75 // 同じキーをもつ要素が複数ある時は行を挿入 76 if (n > 0) { 77 sheet2.insertRowAfter(i + rowsCount + 1); 78 rowsCount++; 79 } 80 const row = i + rowsCount; 81 data.bc[row] = [value.a]; 82 data.g[row] = [value.h]; 83 data.h[row] = [value.i]; 84 }); 85 } else { 86 // マッチしない場合 87 const row = i + rowsCount; 88 data.bc[row] = ['']; 89 data.g[row] = ['']; 90 data.h[row] = ['']; 91 } 92 }); 93 94 // 各列ごとに配列に蓄積した値を記入 95 if (data.bc.length > 0) { 96 sheet2.getRange(1, column.bc, data.bc.length, 1).setValues(data.bc); 97 sheet2.getRange(1, column.g, data.g.length, 1).setValues(data.g); 98 sheet2.getRange(1, column.h, data.h.length, 1).setValues(data.h); 99 } 100}

投稿2024/10/25 20:46

編集2024/10/25 20:59
YellowGreen

総合スコア800

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問