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

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

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

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

Q&A

解決済

1回答

1060閲覧

GASの記述にていて、スプレットシート1とシート2の比較したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2019/05/14 13:05

スプレットシート2つのシート「元データ」、「更新後データ」の各カラムを比較して、変更があったカラムの行をすべて他のシートに抽出したいのですが、どのような記述になりますでしょうか。

自分では、あるカラムの値が固定値の場合しかわからず、以下のように書いたものの、各カラムの比較の書き方がわかりませんでした。

宜しくお願いします。

===
以下記載

gas

1 2function syoukyaku_before(){ 3var sheet = SpreadsheetApp.getActiveSpreadsheet(); 4var ss = sheet.getSheetByName("元データ"); 5var a_mst = sheet.getSheetByName("更新後データ") 6 7const master = a_mst.getDataRange().getValues(); 8 9if(date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate()){ 10return true; 11}else{ 12return false; 13} 14 15//#} 16 17const inventory = master 18.filter(function(e){return e[cIndex['ビジネス名']] === '小野'}) 19.map(function(e){ 20const columns = [ 21cIndex['店舗コード'], 22cIndex['ビジネス名'], 23cIndex['住所 1'], 24cIndex['住所 2'], 25cIndex['住所 3'], 26cIndex['住所 4'], 27cIndex['住所 5'], 28cIndex['地域の下位区分'], 29cIndex['地域区分'], 30cIndex['行政区域'], 31cIndex['国または地域'], 32cIndex['郵便番号'], 33cIndex['緯度'], 34cIndex['経度'], 35cIndex['電話番号 1'], 36cIndex['電話番号 2'], 37cIndex['ウェブサイト'], 38cIndex['メインカテゴリ'], 39cIndex['追加カテゴリ'], 40cIndex['日曜日の営業時間'], 41cIndex['月曜日の営業時間'], 42cIndex['火曜日の営業時間'], 43cIndex['水曜日の営業時間'], 44cIndex['木曜日の営業時間'], 45cIndex['金曜日の営業時間'], 46cIndex['土曜日の営業時間'], 47cIndex['特別営業時間'], 48cIndex['ビジネス情報'], 49cIndex['開業日'], 50cIndex['ロゴ写真'], 51cIndex['カバー写真'], 52cIndex['その他の写真'], 53cIndex['ラベル'] 54], row = []; 55for (var i = 0; i < columns.length; i++) row.push(e[columns[i]]); 56return row; 57}); 58 59if (inventory.length) { 60ss.getRange(ss.getLastRow()+1, 1, inventory.length, inventory[0].length).setValues(inventory); 61} 62}

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提として、列の配置は同じと思ってます。
まあ、多分下にあげるような感じだし、この程度なら数分で書けはするけども、使ってるのスプレッドシートですよ?

同じ構造してる(比較したい列が同じ順でなくても、1対1対応する)なら
普通に、シート3の例えばA1には
=IF('シート1'!A1='シート2'!A1, "", 'シート1'!A1)とかってやれば、違うセルだけ表示されるので、ソートとかフィルタすればいいし、加工したければ値でコピペすればいいし、店舗コードやビジネス名は常に表示するとかも容易に仕様変更できる。何ならA-Zにシート1,AA-AZにシート2をだして、違うセルに条件書式で色をつければ、どのようにかわったかもわかる。これら両方を実行することも容易

確かにセル関数だと列が違ってたとき(A列とF列が対応している)、最初にかきづらいけど、最初だけ。
一行作ればフィルできるし、おそらく何回でも使い回せる(毎回列がかわるデータが得られるとしたら、その運用どうにかしたほうがいい)

なんでわざわざ手間をかけて(それも自分の手に負えないから仕様変更で直すことすらできない)同等かもっと不便な結果を得たいのか分からない。

普通にエクセルの勉強したほうがいいと思います。

javascript

1//動作未検証、無保証で 2function q189384() { 3 const book = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet1Dat = book.getSheetByName("sheet1"); //こっちが結果を得たい側(表示させたい側)多分更新後シート 5 const sheet2Dat = book.getSheetByName("sheet2"); 6 const diffs = sheet1Dat.filter(function(e,i) { return e.some(function(f,j){ return f !== sheet2Dat[i][j];}); } ); 7 const sheet3 = book.getSheetByName("sheet3"); 8 sheet3.clear(); 9 if(diffs.length < 1) return; 10 sheet3.getRange(1,1,diffs.length, diffs[0].length).setValues(diffs); 11}

投稿2019/05/14 13:56

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問