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

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

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

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

Q&A

解決済

3回答

3505閲覧

GAS を使ってスプレッドシートの重複セルの個数

damaa

総合スコア20

Google Apps Script

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

0グッド

1クリップ

投稿2018/02/06 22:34

A列 買い物リスト サラダ ご飯 パン ご飯 サラダ ご飯 スープ

から
サラダ 2 ご飯3 パン1 スープ1
という風に単語と個数を調べるのにはどうすればいいのでしょうか??

※サラダなどの項目は決まっておらず、変動します。

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

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

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

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

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

guest

回答3

0

あくまでも目的を果たすだけなら、わざわざGASを使用する必要はありませんよ。
一例ですが、組み込み関数で事足ります。

例)A列3行目からデータが存在
B列3行目に =UNIQUE(A3:A) を入力。
C列3行目に =ARRAYFORMULA(IF(B3:B<>"",COUNTIF(A3:A,B3:B),"")) を入力。

その他、QUERY() を使っても可能かと思います。

投稿2018/02/07 02:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

damaa

2018/02/07 06:37

ご回答ありがとうございます! GASでデータを外部に渡したりとしたいので、 =UNIQUE(A3:A) は元のデータが多くても大丈夫そうなのですが、(大丈夫でした。確認済み) =ARRAYFORMULA(IF(B3:B<>"",COUNTIF(A3:A,B3:B),"")) だと動作が重くなってしまいます、、、 (軽くしたいです。) QUERY()での記述方法は、group by などを使うのしょうか??
退会済みユーザー

退会済みユーザー

2018/02/07 07:50

こんな感じでしょうね。 =QUERY(A3:A,"select A,count(A) group by A label count(A) ''") ※クエリでcount等を使うとラベルが付きますが、個人的に非表示にしています。
damaa

2018/02/07 18:00

ご回答ありがとうございます! なるほどです!勉強になりました!
guest

0

ベストアンサー

スクリプトでの集計例です。配列で集計結果を得られます。
itemDataResult_aとitemDataResult_bいずれも同じ結果を返します。

A3以下にデータ部分があるものとします。

function myFunction() { var Sp = SpreadsheetApp.getActiveSpreadsheet();//アクティブスプレッドシート指定でオブジェクト代入 var Sh = Sp.getActiveSheet();//アクティブシートオブジェクト代入 var itemData = [];//買い物リスト格納用配列の宣言 var StartRow = 3;//買い物リストの開始行を宣言して代入 var lastRow = Sh.getLastRow();//データの入っている最終行数の取得 Logger.log('最終行数:' + lastRow);//ログ出力 itemData = Sh.getRange(StartRow,1,lastRow-StartRow,1).getValues()//配列itemDataにセル値を押し込む Logger.log('セルデータ取得配列:' + itemData); var itemDataResult_a = [[]];//買い物リスト集計結果格納用配列の宣言:① var itemDataResult_b = [];//買い物リスト集計結果格納用配列の宣言:② var itemCounter = 0;//アイテム種数カウンタ変数宣言と代入(①に必要) for (var i = 0; i<itemData.length ; i++){ if (itemData[i][0] == ""){continue}//カウント済のアイテムで空白が既にセットされていればスルー var tmpCounter = 1;//アイテム発生数カウンタ変数宣言と代入 for (var j = i+1 ;j<itemData.length; j++){ if (itemData[i][0] == itemData[j][0]){//同じアイテムが後方に見つかったら tmpCounter += 1;//アイテム発生数カウンターに1加える itemData[j][0]="";//同じアイテムの2個目以降のデータを空白にする } } itemDataResult_a[itemCounter]=[itemData[i][0],tmpCounter];//①集計結果配列へ格納 itemDataResult_b.push([itemData[i][0],tmpCounter])//②集計結果配列へ格納 itemCounter += 1//アイテム種数カウンタに1を加える } //①シートC3~D列に集計結果配列を一斉書き込み Logger.log('集計配列_a:' + itemDataResult_a); Sh.getRange(1,3,lastRow,2).clearContent()//①シートC~D列をクリア Sh.getRange(1,3).setValue('発生数itemDataResult_a')//①C1に表題セット Sh.getRange(3,3,itemDataResult_a.length,2).setValues(itemDataResult_a); //②シートE3~F列に集計結果配列を一斉書き込み Logger.log('集計配列_b:' + itemDataResult_b); Sh.getRange(1,6,lastRow,2).clearContent()//②シートE~F列をクリア Sh.getRange(1,6).setValue('発生数itemDataResult_b')//②E1に表題セット Sh.getRange(3,6,itemDataResult_b.length,2).setValues(itemDataResult_b); }

投稿2018/02/07 07:55

編集2018/02/07 09:07
jinshan

総合スコア107

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

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

damaa

2018/02/07 18:03

ご回答ありがとうございます! 2通りの方法をあげていただきとてもわかりやすく コメントつきで 丁寧なご回答に感謝しております! 処理も早いのでとても嬉しく思います! GASを使ってとのことでしたので、ベストアンサーにさせていただきます!
guest

0

QUERYを使うなら、

=QUERY(A1:A,"select A,count(A) where A!='' group by A label count(A) ''")

とかでいいんじゃないでしょうか?項目の順番が決まっていてるならもうひと工夫必要になりますが。

イメージ説明

投稿2018/02/07 07:46

true

総合スコア440

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

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

damaa

2018/02/07 17:58

ご回答ありがとうございます! スプレッドシートで今後多く活用していきたいと思います! 丁寧に画像まであげていただき感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問