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

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

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

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

Q&A

解決済

3回答

1705閲覧

配列の重複データ全体を削除するには

rena_168

総合スコア72

Google Apps Script

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

0グッド

0クリップ

投稿2020/03/06 07:25

イメージ説明

GoogleスプレッドシートのA列の重複しないデータ(A1とA3のみ)の行内容を新規配列に追加したいですが、
うまくGASが書けないです。

array = [A1,A2,A2,A3,A4,A4];
array2 = [A2,A2,A4,A4];

arrayとarray2の差分で[A1,A3]は取得できますが、もっと効率の良いGASが書けないですが、どうでしょうか。

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

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

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

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

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

guest

回答3

0

jaavascript

1SpreadsheetApp.getActiveSheet().getDataRange().getValues().map(e=>e[0]).filter((e,i,a)=>a.indexOf(e)===i);

indexOfにこだわりないなら、Setを使ったほうが可読性高いと思います。

投稿2020/03/06 11:24

papinianus

総合スコア12705

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

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

papinianus

2020/03/09 14:37

なぜこれでマイナスなのか教えてほしい。
guest

0

ベストアンサー

こんな感じですか?

重複しないレコードだけ取り出すサンプルファイル

実際につくってみて、A列の重複してるものだけをリストアップ。
それを対象にA列の値を一個ずつしらべて、falseならば配列にpushする感じです。V8 Runtimeをオンで使用しています。

javascript

1//実際に出力してみる 2function hikaku(){ 3 //スプレッドシートのデータを取得する 4 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); 5 6 //シートデータを取得する 7 var ss = sheet.getRange("A1:C6").getValues(); 8 9 //A列だけ取得する 10 var array = sheet.getRange("A1:A6").getValues(); 11 12 //A列を1次元配列で取り出す 13 const list = array.reduce((pre,current) => {pre.push(...current);return pre},[]); 14 15 //重複要素だけ取り出す 16 let result = list.filter(function(x, i, self) { 17 return self.indexOf(x) !== i; 18 }); 19 20 //ssの塊から重複していないレコードだけ、配列に取り出す 21 var singleman = []; 22 23 for(var i = 0;i<ss.length;i++){ 24 //重複リストにいるかどうか判定 25 var ret = result.includes(ss[i][0]); 26 27 //falseの場合配列にレコード単位でpush 28 if(ret == false){ 29 singleman.push(ss[i]); 30 } 31 } 32 33 //スプレッドシートのE列辺りに出力 34 var lastColumn = singleman[0].length;  //カラムの数を取得する 35 var lastRow = singleman.length;     //行の数を取得する 36 sheet.getRange(1,5,lastRow,lastColumn).setValues(singleman); 37 38}

投稿2020/03/06 12:39

officeforest

総合スコア412

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

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

rena_168

2020/03/09 01:39

@officeforest サンプルコードありがとうございます! シートの行数はそんなに多くないのですが、一つ気になるのが、もしデータが多くなると、GAS実行制限(6分?)のことは大丈夫なんでしょうか?
officeforest

2020/03/09 03:32

メモリ上で作業してるので、今回のケースであれば、そこまで莫大なレコード数でなければ問題ありません。 1行ずつ書き出すであったりとか、5万件超えるとか無茶なことをするのでなければ
rena_168

2020/03/09 04:38

なるほど、ありがとうございます!
guest

0

全体の配列で、要素一つずつindexOfで探しに行って、1つのみならばその要素を新規配列に追加するのは、
いかがでしょうか?
ただ、そのindexOfは見つかったら番地が返ってきますが、個数は知らないですよね?
個数が分かる方法を教えていただきたいです。

投稿2020/03/06 07:37

rena_168

総合スコア72

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問