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

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

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

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

JavaScript

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

Q&A

解決済

1回答

2510閲覧

【GAS】重複したデータを転記したい

moro_05

総合スコア4

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2023/01/22 12:55

編集2023/01/22 14:59

前提

A列からE列までが名前、アドレス、参加日、参加グループ、性別の5列のデータから
名前、アドレス、性別の3つのデータが重複した行を、別のシートに転記させたいです。

実現したいこと

今は名前、アドレス、性別をまとめて一つのデータにしてから重複を探しているのですが、
重複したデータを転記するときに1つのセルに名前、アドレス、性別が一緒になって表示されるようになっています。

重複した行を元のデータのように5列で表示させるにはどうすれば良いでしょうか?
1つのデータにしているのは3つのセルが一緒だった場合のやり方がわからないためです
GAS初心者のため、稚拙なコードですが教えていただきたいです。

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

エラーメッセージ

該当のソースコード

GAS

1function myFunction() { 2 var SS =SpreadsheetApp.getActiveSpreadsheet(); 3 var Sheet =SS.getSheetByName("シート"); 4 var DuplicationSheet=SS.getSheetByName("重複"); 5 6 var StartColumn = 1; 7 var StartRow=2; 8 var LastColumn=5; 9 var LastRow =Sheet.getRange(Sheet.getMaxRows(),StartColumn).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 10 11 var Array=Sheet.getRange(StartRow,StartColumn,LastRow-1,LastColumn).getValues(); 12 13 //重複を探すためのデータだけにした 14 var Array1=Array.map(elm => [elm[0],elm[1],elm[4]]); 15 16 //ArrayからArray1を除いた配列 17 var Array2=Array.map(elm => [elm[2],elm[3]]); 18 19 //重複を探すためのデータを結合 20 var Array3=[]; 21 for(var i =0; i <Array1.length; i++){ 22 Array3.push(Array1[i].join("")); 23 } 24 //Array3を二次元配列にする 25 var Array4=[]; 26 Array3.forEach(value => Array4.push([value])); 27 Logger.log(Array4); 28 29 //Array2とArray4を結合してArray5にする 30 var Array5=[]; 31 for(y in Array4){ 32 if(Array2[y]){ 33 Array5[y]=Array4[y].concat(Array2[y]); 34 }else{ 35 Array5[y]=Array4[y]; 36 } 37 } 38 var Result=Array3.filter(function(x,i,self){ 39 return self.indexOf(x)!==i; 40 }) 41 var Single=[]; 42 for(var i=0;i<Array5.length;i++){ 43 var Ret=Result.includes(Array5[i][0]); 44 if(Ret==true){ 45 Single.push(Array5[i]); 46 } 47 DuplicationSheet.getRange(2,1,Single.length,3).setValues(Single); 48 } 49} 50

試したこと

ここに問題に対して試したことを記載してください。

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

元のデータ
イメージ説明

得たい結果
イメージ説明

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

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

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

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

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

Cocode

2023/01/22 14:35 編集

具体的にどういう結果を得たいのでしょうか? (今の文章の説明だけだと、数通り考えられるため曖昧です) 元のデータのシートのスクリーンショットと、得たい結果のシートのスクリーンショットを例として貼り付けていただけると大変嬉しいです。 (質問は編集できますので、編集して画像を追加してください〜!)
moro_05

2023/01/22 14:54

画像追加しました。 重複している行をそのまま別のシートに転記したいです。
Cocode

2023/01/22 17:01

画像ありがとうございます!とても分かりやすいです。
guest

回答1

0

ベストアンサー

すみません質問者様のコードが複雑でしたので、新たにコードを組み直しました。
一応ご希望の処理が実行できるものにはなりましたが、気に入っていない箇所もあります。
他の回答者様からよりよい回答を得られることを期待しつつ、一つご紹介させていただきます。

コード例

↓元の一覧(黄色と緑が、名前・アドレス・性別すべて重複しているデータです)¥
イメージ説明

↓重複データのみを転記した一覧
イメージ説明

javascript

1function transcribeDuplicatedPeople() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 4 const originalSheet = ss.getSheetByName('元データ'); // 元の一覧データのシートを取得 5 const originalValues = originalSheet.getDataRange().getValues().slice(1); // 2行目以降の全データを取得 6 const tempValues = originalValues.map(([name, address, _, __, gender]) => [name, address, gender]); // 「名前」「アドレス」「性別」のみに絞った2次元配列を新規作成 7 // console.log(tempValues); 8 9 let duplicatedIndexes = []; // 重複しているインデックス番号を格納する用の配列 10 11 tempValues.forEach((record, index) => { // 重複をチェック 12 if (duplicatedIndexes.includes(index)) return; // すでに確認済みのデータでは何もしない 13 14 tempValues.slice(index+1).forEach((r, i) => { 15 const isSame = [...new Set([...record, ...r])].length === record.length; // 比較中の2つの配列の重複している値を削除した時に長さが元の配列のまま(今回なら3)なら、全値重複しているということなのでtrue、じゃなかったらfalseを戻す 16 if (isSame) duplicatedIndexes.push(index, i+index+1); // 全値重複していたら、そのインデックス番号を配列に追加する 17 }); 18 }); 19 20 // console.log(duplicatedIndexes); 21 duplicatedIndexes = [...new Set(duplicatedIndexes)].sort(); // 重複しているインデックス番号を削除し、昇順に並び替え 22 // console.log(duplicatedIndexes); 23 24 const results = duplicatedIndexes.map(number => originalValues[number]); // 該当するインデックス番号のみのデータの配列を生成 25 // console.log(results); 26 27 const resultSheet = ss.getSheetByName('重複データ'); // 出力先のシートを取得 28 resultSheet.getRange(2, 1, results.length, results[0].length).setValues(results); // 書き込む 29}

※コメントアウトをしていますがconsole.log()を所々残しておきました。コメントを解除してスクリプトを実行しログを確認していただくと、どのような処理がされているのか分かり易いと思います。

投稿2023/01/22 17:08

Cocode

総合スコア2314

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

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

moro_05

2023/01/23 05:36

回答いただきありがとうございます。 重複を転記する書き方だけでなく、「名前」「アドレス」「性別」のみに絞った2次元配列の取得方法などもとても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問