回答編集履歴

3

コード修正

2018/12/25 16:01

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
88
88
 
89
- const header = masterA.shift(), cIndex = {};
89
+ const header = master.shift(), cIndex = {};
90
90
 
91
91
  for (var i = 0; i < header.length; i++) cIndex[header[i]] = i;
92
92
 

2

コード修正

2018/12/25 16:01

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -86,9 +86,9 @@
86
86
 
87
87
  // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
88
88
 
89
- const heading = master.shift(), cIndex = {};
89
+ const header = masterA.shift(), cIndex = {};
90
90
 
91
- for (var i = 0; i < heading.length; i++) cIndex[heading[i]] = i;
91
+ for (var i = 0; i < header.length; i++) cIndex[header[i]] = i;
92
92
 
93
93
 
94
94
 

1

追記

2018/12/23 05:05

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -9,3 +9,129 @@
9
9
  0. 棚卸シートに必要な列のみ抽出する。[map()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
10
10
 
11
11
  0. 棚卸シートの最終行に追加する。[setValues()](https://developers.google.com/apps-script/reference/spreadsheet/range#setValues(Object))
12
+
13
+
14
+
15
+ ### 追記
16
+
17
+ これはサンプルです。
18
+
19
+ ```GAS
20
+
21
+ function syoukyaku_before(){
22
+
23
+ var sheet = SpreadsheetApp.getActiveSpreadsheet();
24
+
25
+ var tana = sheet.getSheetByName("setsubi_tana");
26
+
27
+ var a_mst = sheet.getSheetByName("setsubi_a_masta")
28
+
29
+
30
+
31
+ const inventory = a_mst.getDataRange().getValues()
32
+
33
+ .filter(function(e){return e[13] === '未'})
34
+
35
+ .map(function(e){
36
+
37
+ const columns = [0,1,3,4,5,6,12,14], row = [];
38
+
39
+ for (var i = 0; i < columns.length; i++) row.push(e[columns[i]]);
40
+
41
+ return row;
42
+
43
+ });
44
+
45
+
46
+
47
+ if (inventory.length) {
48
+
49
+ tana.getRange(tana.getLastRow()+1, 1, inventory.length, inventory[0].length).setValues(inventory);
50
+
51
+ }
52
+
53
+ }
54
+
55
+ ```
56
+
57
+
58
+
59
+ このサンプルだと、配列アクセスに`e[13]`とか`e[0]`とかで分かりづらいですね。
60
+
61
+ せめてカラム名でアクセスできるようにしてみます。
62
+
63
+ これでコードの可読性が向上し、後々発生するであろう変更(カラム追加等)にも比較的容易に対応することができます。
64
+
65
+
66
+
67
+ ```GAS
68
+
69
+ function syoukyaku_before(){
70
+
71
+ var sheet = SpreadsheetApp.getActiveSpreadsheet();
72
+
73
+ var tana = sheet.getSheetByName("setsubi_tana");
74
+
75
+ var a_mst = sheet.getSheetByName("setsubi_a_masta")
76
+
77
+
78
+
79
+ const master = a_mst.getDataRange().getValues();
80
+
81
+
82
+
83
+ // カラム名で配列アクセスするためのインデックスを作成する
84
+
85
+ // ※前提条件:1行目は見出しであること
86
+
87
+ // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
88
+
89
+ const heading = master.shift(), cIndex = {};
90
+
91
+ for (var i = 0; i < heading.length; i++) cIndex[heading[i]] = i;
92
+
93
+
94
+
95
+ const inventory = master
96
+
97
+ .filter(function(e){return e[cIndex['列14']] === '未'})
98
+
99
+ .map(function(e){
100
+
101
+ const columns = [
102
+
103
+ cIndex['列1'],
104
+
105
+ cIndex['列2'],
106
+
107
+ cIndex['列4'],
108
+
109
+ cIndex['列5'],
110
+
111
+ cIndex['列6'],
112
+
113
+ cIndex['列7'],
114
+
115
+ cIndex['列13'],
116
+
117
+ cIndex['列15'],
118
+
119
+ ], row = [];
120
+
121
+ for (var i = 0; i < columns.length; i++) row.push(e[columns[i]]);
122
+
123
+ return row;
124
+
125
+ });
126
+
127
+
128
+
129
+ if (inventory.length) {
130
+
131
+ tana.getRange(tana.getLastRow()+1, 1, inventory.length, inventory[0].length).setValues(inventory);
132
+
133
+ }
134
+
135
+ }
136
+
137
+ ```