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

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

ただいまの
回答率

87.35%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 8,391

score 20

A列
買い物リスト

サラダ
ご飯
パン
ご飯
サラダ
ご飯
スープ

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/07 15:37

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

    キャンセル

  • 2018/02/07 16:50

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

    キャンセル

  • 2018/02/08 03:00

    ご回答ありがとうございます!

    なるほどです!勉強になりました!

    キャンセル

checkベストアンサー

+1

スクリプトでの集計例です。配列で集計結果を得られます。
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/08 03:03

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

    キャンセル

+1

QUERYを使うなら、

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

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

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/08 02:58

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

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る