回答編集履歴

3

コード修正

2018/12/25 16:01

投稿

shozi3
shozi3

スコア691

answer CHANGED
@@ -42,7 +42,7 @@
42
42
  // カラム名で配列アクセスするためのインデックスを作成する
43
43
  // ※前提条件:1行目は見出しであること
44
44
  // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
45
- const header = masterA.shift(), cIndex = {};
45
+ const header = master.shift(), cIndex = {};
46
46
  for (var i = 0; i < header.length; i++) cIndex[header[i]] = i;
47
47
 
48
48
  const inventory = master

2

コード修正

2018/12/25 16:01

投稿

shozi3
shozi3

スコア691

answer CHANGED
@@ -42,8 +42,8 @@
42
42
  // カラム名で配列アクセスするためのインデックスを作成する
43
43
  // ※前提条件:1行目は見出しであること
44
44
  // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
45
- const heading = master.shift(), cIndex = {};
45
+ const header = masterA.shift(), cIndex = {};
46
- for (var i = 0; i < heading.length; i++) cIndex[heading[i]] = i;
46
+ for (var i = 0; i < header.length; i++) cIndex[header[i]] = i;
47
47
 
48
48
  const inventory = master
49
49
  .filter(function(e){return e[cIndex['列14']] === '未'})

1

追記

2018/12/23 05:05

投稿

shozi3
shozi3

スコア691

answer CHANGED
@@ -3,4 +3,67 @@
3
3
  0. マスタシートの全行を二次元配列に格納する。[getValues()](https://developers.google.com/apps-script/reference/spreadsheet/range#getValues())
4
4
  0. 14列目が”未”の行のみ抽出する。[filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
5
5
  0. 棚卸シートに必要な列のみ抽出する。[map()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
6
- 0. 棚卸シートの最終行に追加する。[setValues()](https://developers.google.com/apps-script/reference/spreadsheet/range#setValues(Object))
6
+ 0. 棚卸シートの最終行に追加する。[setValues()](https://developers.google.com/apps-script/reference/spreadsheet/range#setValues(Object))
7
+
8
+ ### 追記
9
+ これはサンプルです。
10
+ ```GAS
11
+ function syoukyaku_before(){
12
+ var sheet = SpreadsheetApp.getActiveSpreadsheet();
13
+ var tana = sheet.getSheetByName("setsubi_tana");
14
+ var a_mst = sheet.getSheetByName("setsubi_a_masta")
15
+
16
+ const inventory = a_mst.getDataRange().getValues()
17
+ .filter(function(e){return e[13] === '未'})
18
+ .map(function(e){
19
+ const columns = [0,1,3,4,5,6,12,14], row = [];
20
+ for (var i = 0; i < columns.length; i++) row.push(e[columns[i]]);
21
+ return row;
22
+ });
23
+
24
+ if (inventory.length) {
25
+ tana.getRange(tana.getLastRow()+1, 1, inventory.length, inventory[0].length).setValues(inventory);
26
+ }
27
+ }
28
+ ```
29
+
30
+ このサンプルだと、配列アクセスに`e[13]`とか`e[0]`とかで分かりづらいですね。
31
+ せめてカラム名でアクセスできるようにしてみます。
32
+ これでコードの可読性が向上し、後々発生するであろう変更(カラム追加等)にも比較的容易に対応することができます。
33
+
34
+ ```GAS
35
+ function syoukyaku_before(){
36
+ var sheet = SpreadsheetApp.getActiveSpreadsheet();
37
+ var tana = sheet.getSheetByName("setsubi_tana");
38
+ var a_mst = sheet.getSheetByName("setsubi_a_masta")
39
+
40
+ const master = a_mst.getDataRange().getValues();
41
+
42
+ // カラム名で配列アクセスするためのインデックスを作成する
43
+ // ※前提条件:1行目は見出しであること
44
+ // ※列1~列15はサンプルのカラム名です。実際のカラム名に修正してください。
45
+ const heading = master.shift(), cIndex = {};
46
+ for (var i = 0; i < heading.length; i++) cIndex[heading[i]] = i;
47
+
48
+ const inventory = master
49
+ .filter(function(e){return e[cIndex['列14']] === '未'})
50
+ .map(function(e){
51
+ const columns = [
52
+ cIndex['列1'],
53
+ cIndex['列2'],
54
+ cIndex['列4'],
55
+ cIndex['列5'],
56
+ cIndex['列6'],
57
+ cIndex['列7'],
58
+ cIndex['列13'],
59
+ cIndex['列15'],
60
+ ], row = [];
61
+ for (var i = 0; i < columns.length; i++) row.push(e[columns[i]]);
62
+ return row;
63
+ });
64
+
65
+ if (inventory.length) {
66
+ tana.getRange(tana.getLastRow()+1, 1, inventory.length, inventory[0].length).setValues(inventory);
67
+ }
68
+ }
69
+ ```