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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

860閲覧

Google Apps Script データベースに無いデータのみを蓄積をしたい

tavernity_nagai

総合スコア20

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/10/08 16:48

編集2021/10/08 17:06

【やりたいこと】
スプレッドシートとGASを用いて工事現場の管理をしようと考えています。
毎年運用するシートの工事現場マスターから、工事現場DB内に存在しない新規のデータのみを
追加(蓄積)できるような仕組みのものを作成しようと考えております。

【課題】
マスターとDBのデータを1枚のシートに出力して、重複してないレコードだけを
DBに追加するようなスクリプトを作成したのですが、この場合の問題点として
『マスターとDBのいずれか一方にしかないデータをDBに書き込む』という処理が走ってしまいます。
『DBにだけ無い』ということを判別するスクリプトはどのように考えて組めば良いのでしょうか。
どなたかご教示いただけますと幸いです。

【現在のコード】

//DBとマスターの情報を書き出して、重複していないものをDBの最終行から追加 function culcUniqueRecord() { //DBのID取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("工事現場マスター"); var DB_ID = "id" //マスターの値を二次元配列で取得 var cmValues = sheet.getRange("A3:B").getValues(); const f = function checkEmpty(values){ return values[0].length > 0; } var list1 =cmValues.filter(f) Logger.log(list1); //DBの情報を取得 var dbSheet = SpreadsheetApp.openById(DB_ID).getSheetByName("工事現場DB"); var cdbValues =dbSheet.getRange("A2:B").getValues(); var list2 = cdbValues.filter(f) Logger.log(list2); //マスターとDBの情報を書き出す var list3 = list1.concat(list2); var cmSetValues =list3.filter(f) Logger.log(cmSetValues); var cmWritesheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("重複判別シート"); //cmWritesheet.clear(); var allcmValues1 = cmWritesheet.getRange(1,1,cmSetValues.length,cmSetValues[0].length).setValues(cmSetValues); var cmWriteValues = cmWritesheet.getRange(1,1,cmSetValues.length,cmSetValues[0].length).getValues(); //A列だけ取得 var array = cmWritesheet.getRange("A:A").getValues(); Logger.log(array); //A列を1次元配列で取り出す const cmlist = array.reduce((pre, current)=> {pre.push(...current); return pre},[]); Logger.log(cmlist); //重複要素だけ取り出す var result = cmlist.filter(function(x, i, self){ return self.indexOf(x) !== i; }) //ssの塊から重複していないレコードだけ、配列に取り出す var singleman = []; for(var j = 0;j<cmWriteValues.length;j++){ //重複リストにいるかどうか判定 var ret = result.includes(cmWriteValues[j][0]); //falseの場合配列にレコード単位でpush if(ret == false){ singleman.push(cmWriteValues[j]); } } Logger.log(singleman); for(var k = 0; k<singleman.length; k++){ list2.push(singleman[k]); } Logger.log(list2) var lastColumn = list2[0].length; var lastRow = list2.length; var writeRangeClear = dbSheet.getRange("A2:B").clear(); dbSheet.getRange(2,1,lastRow,lastColumn).setValues(list2); }

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

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

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

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

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

guest

回答2

0

自分でちゃんと考えれば解決する問題だと思いました。

投稿2021/10/08 19:48

qqfsdfsafd

総合スコア599

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

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

qqfsdfsafd

2021/10/08 23:59

プログラミングというものは自分で考えればわかることと、何かを知らないがゆえにわからないことに大別出来ます。自分で考えればわかることを人に考えてもらう質問は良くないと思います。知らないことを人に聞くのはありだと思いますが。
tavernity_nagai

2021/10/09 00:16

ありがとうございます。 自分なりに考えて、行き詰まってしまい 今回のように質問をしてしまいました。 丁寧なご回答いただきありがとうございます。
guest

0

ベストアンサー

質問の趣旨は、どのように考えて、ですか。
取得ソース(マスター)から、現在のデータ(現場側)の差分(集合の引き算)を取ればいいです。

  • マスタ
AB
a1
b2
c3
  • 現場
AB
z26
y25
b2

から

  • 現場
AB
z26
y25
b2
a1
c3

が作りたいものと理解。
現状のコードだと、そもそも重複が消える(両方のうち片方にしかないものしか残らない)ように見えましたが添削はしてません。

javascript

1const q363521 = () => { 2 const master = SpreadsheetApp.getActive().getSheetByName("マスター").getDataRange().getValues().filter(isColANotEmpty); 3 const fieldSheet = SpreadsheetApp.openById("id").getSheetByName("現場"); 4 const currentFieldData = fieldSheet.getDataRange().getValues(); 5 const existingKeys = currentFieldData.map(e=>e[0]).flat(); 6 const nonExistingFromMaster = master.filter(e=>!existingKeys.includes(e[0])); 7 const sum = currentFieldData.concat(nonExistingFromMaster); 8 fieldSheet.clearContents().getRange(1,1,sum.length,sum[0].length).setValues(sum); 9} 10const isColANotEmpty = (r) => r[0] !== "";

投稿2021/10/08 18:50

papinianus

総合スコア12705

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

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

tavernity_nagai

2021/10/09 00:01

ご回答ありがとうございます。 取得ソースと現場の差分を出す 集合の引き算を実現したかったのですが ご指摘いただいたように、そもそも両方のうち片方にしかないものしか残らない というということになってしまい、困り質問を投稿させていただきました。 質問事項に至らぬ点が多い中でも、丁寧にお答えいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問