前提・実現したいこと
スプレッドシートにデータベースを構築し、その情報を取り出して、いろいろ情報を取得したり加工したりしようとしています。
その際、1つのデータベースから、やりたい処理(親子構造に関する物や単価等の情報走査)に応じて、
情報を一部置換する必要がでてきました。
そこで諸々データベースの取得と、それを一部変更するプログラムを作成し、実行したところ、
自分としては、取得したデータベースと変更したデータベースの2つが出来ると思っていたところ、
両方とも変更されたデータベースになってしましました。
該当のソースコード
GAS
1function main() { 2const DB1 = LibraryDB().slice(); 3//情報を取得 4Logger.log(DB1) 5 6const DB2 = masterConvertCostDB(DB1).slice(); 7//取得した情報を変更 8 9Logger.log(DB1) 10//同じLogger.log(DB1)なのに、ログを見ると、情報が変わっている。 11} 12 13//区分にある情報がBならAに、CならDに置換しています。 14//(実際のコードでは置換以外にもいろいろやってはいます) 15function masterConvertCostDB(DB){ 16var DB2 = DB.slice(); 17 LibraryReplaceFt(DB2, 3, "B","A") 18 LibraryReplaceFt(DB2, 3, "C","D") 19return DB2 20 21} 22 23 24function LibraryReplaceFt(arr, col, from, to) 25{ 26 var a = arr.slice(); 27 for( var b in a) 28 { 29 a[b][col] = String(a[b][col]).replace(from,to).slice(); 30 } 31return a 32} 33 34 35function LibraryDB(){ 36var DB = [ 37 ["No.","親番","子番","区分","単価"], 38 [1,"A01","A01A","A",100], 39 [2,"A01","A01B","B",20], 40 [3,"A01","A01C","C",350], 41 [4,"A02","A02A","A",2], 42 [5,"A02","A02B","B",1.8], 43 [6,"A02","A02C","D",100], 44 [7,"B01","B01A","A",1500], 45 [8,"B01","A02B","C",1100], 46 ]; 47return DB 48} 49 50
試したこと
諸々調査していくと、結局のところ、自分でコード化した
LibraryReplaceFt(arr, col, from, to)
が原因であることは判明したのですが、自分の中の知識では、
処理が破壊的に行われるのであれば、 .slice()を挟めば解決するという知識しかなく、
.slice()をいたるところに設置しても解決できない状態になっております・・・
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 23:34
2020/05/27 23:37
2020/05/27 23:43