• HOME
  • p.c.c. blog
  • Google Apps Scriptによる「重複データの列まるごと削除」
p.c.c. blog

メディア運営や請負ウェブ制作などを通して得た
経験や情報を
その場で消費せずアウトプットする
ための場としてのブログ。

gas

googleスプレッドシート、ものすごく便利ですよね!
ただエクセルにある機能が無かったりする場合があります。

例えば、1行のうち、1セルのみ重複してた場合は行ごと重複データのみ削除するという機能、エクセルだとたしかできたんですが、Googleドライブのスプレッドシートには存在しません。
今回はこの機能を作成してみました。

求める要件定義

  • 顧客リストのテーブルがあって、住所とかだと全角やスペースやアパート名省略とかあったりするため、電話番号のみで重複を検知したい。
  • なおかつ最初に出てきたものだけ残し、後から出てきた重複データを行ごと削除する。

Google Apps Script (GAS)を書く

GAS


function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var addon = ui.createAddonMenu();
  addon.addItem('重複削除ボタンを表示', 'showSidebar');
  addon.addToUi();
}

function onInstall() {
  onOpen();
}
 
function showSidebar() {
  var ui = SpreadsheetApp.getUi();
  var sidebar = HtmlService.createHtmlOutputFromFile('Sidebar');
  sidebar.setTitle('Remove Duplicates Lines');
  ui.showSidebar(sidebar);
}

function removeDuplicatesLines() {
        var ui = SpreadsheetApp.getUi();
        ui.alert("処理を開始します。",'このダイアログを閉じると処理が始まります。10秒ほど時間がかかります。元に戻す場合は、完全に終了してからCtrl+Zで戻せます。', ui.ButtonSet.OK);
    var sheet = SpreadsheetApp.getActiveSheet(),
        rowNum = 3000,
        targetCol = 2,
        maxCol = 10,

        dataTel = sheet.getRange(1,targetCol,rowNum,1).getValues(),
        data = sheet.getRange(1,1,rowNum,maxCol).getValues(),

        newData = new Array(),
        checkData = new Array();
  
    for (i in data) {
        var row = data[i],
            checkRow = dataTel[i],
            duplicate = false;
        for (j in checkData) {
            if (checkRow.join() == checkData[j].join()) {
                duplicate = true;
            }
        }
        if(!duplicate){
            checkData.push(checkRow);
            newData.push(row);
        }
    }
  
    sheet.clearContents();
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

forのループ内のインデックスを別の配列で使い回すということをやってみた。こういう使い方をしたことが無かったので、ひらめいた時は楽しくなりますね!

そしてサイドバー用のHTMLも作成します。適当なのでデザイン性はなしです。

Sidebar.html


<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
<h1>Remove Duplicates Lines</h1>
<div><button onclick="doAction(event);" class="action">Click</button></div>
<script>
function doAction(e) {
  google.script.run
    .withUserObject(this)
    .removeDuplicatesLines();
}
</script>
  </body>
</html>

アドオンとしてChromeウェブストアに登録する

今回作成したスクリプトは社内で使うツールとして作成したため、みんな使えるようにしないとならない。

しかも使いたいスプレッドシート数が数十〜数百ある。

どうもGASは、作成したスプレッドシートでしか使えない

というわけで、汎用的に使い回すためにはChromeウェブストアに登録するしか無いようです。
スプレッドシートの数が少ないのであればコピペでいいんですけど・・・。

ただ、一般公開は審査があるので、こんなボロソースは審査にかけられません!
テストユーザーを選定すればなんと審査無しで仲間内で使えるようになるとのことなので、そのようにしました。なので、使いたい方はコピペでどうぞ!ウェブストア内を探しても出ないので。

で、登録時にかかる5ドルを支払い、なんとかテストアップ状態にこぎつけました。

アドオンとしてウェブストアに登録しておけば、仕様変更(バージョンアップ)も全体に反映できるのでおすすめです!

株式会社p.c.c.

フロントエンドの下請け・請負制作をはじめ、多数のウェブコンテンツを自社で企画・制作・運営している会社です。企業の外部ウェブ担当として顧問契約も行っています。