【やりたいこと】
スプレッドシートと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); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/08 23:54
2021/10/08 23:59
2021/10/09 00:16