回答編集履歴

7

コメントを再修正

2023/07/27 03:37

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -10,7 +10,7 @@
10
10
  colBegin: 2, //開始列:B列
11
11
  colEnd: 13, //最終列:M列(この列以降は不要:N列~)
12
12
  colStatus: 5, //ステータスの列:E列
13
- colNumber: 7, //番号の列:M
13
+ colNumber: 7, //番号の列:G
14
14
  colFillerBegin: 10, //不要な列の開始列:J列
15
15
  colFillerEnd: 12, //不要な列の終了列:L列
16
16
  };

6

コメントを再修正

2023/07/27 03:36

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -8,7 +8,7 @@
8
8
  const fr = { //転記元データ
9
9
  rowBegin: 5, //開始行:5行目
10
10
  colBegin: 2, //開始列:B列
11
- colEnd: 13, //最終列:G列(この列以降は不要:N列~)
11
+ colEnd: 13, //最終列:M列(この列以降は不要:N列~)
12
12
  colStatus: 5, //ステータスの列:E列
13
13
  colNumber: 7, //番号の列:M列
14
14
  colFillerBegin: 10, //不要な列の開始列:J列

5

コメントを再修正

2023/07/27 03:35

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -8,9 +8,9 @@
8
8
  const fr = { //転記元データ
9
9
  rowBegin: 5, //開始行:5行目
10
10
  colBegin: 2, //開始列:B列
11
- colEnd: 13, //最終列:この列以降は不要:N列
11
+ colEnd: 13, //最終列:G列(この列以降は不要:N列~)
12
12
  colStatus: 5, //ステータスの列:E列
13
- colNumber: 7, //番号の列:G
13
+ colNumber: 7, //番号の列:M
14
14
  colFillerBegin: 10, //不要な列の開始列:J列
15
15
  colFillerEnd: 12, //不要な列の終了列:L列
16
16
  };

4

コメントを追記、修正

2023/07/27 03:22

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -20,8 +20,8 @@
20
20
  colNumber: 6, //番号の列:F列
21
21
  };
22
22
  const ss = SpreadsheetApp.getActiveSpreadsheet();
23
- fr.sheet = ss.getSheetByName(FROM_NAME);
23
+ fr.sheet = ss.getSheetByName(FROM_NAME);//← FROM_NAMEを実際の 'シート名' で書換
24
- to.sheet = ss.getSheetByName(TO_NAME);
24
+ to.sheet = ss.getSheetByName(TO_NAME);//同上
25
25
  //転記元データを二次元配列として取得
26
26
  let fromValues = fr.sheet.getRange(fr.rowBegin, fr.colBegin, fr.sheet.getLastRow() - fr.rowBegin + 1, fr.colEnd - fr.colBegin + 1).getValues();
27
27
  //確定となっている要素を抽出
@@ -35,7 +35,7 @@
35
35
  if (fromValues.length > 0) {
36
36
  //不要な列の要素を除く
37
37
  fromValues.forEach(f => f.splice(fr.colFillerBegin - fr.colBegin, fr.colFillerEnd - fr.colFillerBegin + 1));
38
- //転記先シートの最終行に記
38
+ //転記先シートの最終行の後
39
39
  to.sheet.getRange(to.sheet.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues);
40
40
  }
41
41
  }
@@ -60,7 +60,7 @@
60
60
  if (vFrom.length > 0) {
61
61
  //不要な列の要素を除く
62
62
  vFrom.forEach(f => f.splice(8, 3));
63
- //転記先シートの最終行に記
63
+ //転記先シートの最終行の後
64
64
  shTo.getRange(shTo.getLastRow() + 1, 1, vFrom.length, vFrom[0].length).setValues(vFrom);
65
65
  }
66
66
  }

3

変数の宣言を修正してみました。番号の列のインデクスの指定を本来の指定にしました。

2023/07/27 03:18

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -1,38 +1,42 @@
1
- 例えば次のようなスクリプトでしょうか。(修正案をアップしました。)
1
+ 例えば次のようなスクリプトでしょうか。(修正案の再修正をアップしました。)
2
2
  当初の例で画像シートの行、列、配列のインデックスを数値のまま(いわゆるマジックナンバーのまま)使っていました。
3
3
  また、転記する列がM列以降となっていたので、N列以降は転記しないように改めました。
4
- 行、列を指定する変数名が多くなりました。
4
+ 行、列を指定する変数名が多くなりました。(→変数の扱いを再修正しました。)
5
- 変数の名前は、右クリックの「シンボル名変更 F2」で適当に修正してみてください。
6
5
 
7
6
  ```JavaScript
8
7
  function myFunction() {
9
- const rowFromBegin = 5;//転記元データの開始行:5行目
10
- const columnFromBegin = 2;//転記元データの開始列:B列
11
- const columnFromEnd = 13;//転記元データ最終列この列以降は不要:M列
12
- const rowToBegin = 4;//転記データの開始列:4行目
8
+ const fr = { //転記データ
9
+ rowBegin: 5, //開始行:5行目
10
+ colBegin: 2, //開始列:B列
11
+ colEnd: 13, //最終列:この列以降は不要:N列
13
- const columnToBegin = 1;//転記先データの開始列:A
12
+ colStatus: 5, //ステータの列:E
14
- const columnFromStatus = 5;//転記元データのステータスの列:E列
15
- const columnToNumber = 6;//転記先データの番号の列:F
13
+ colNumber: 7, //番号の列:G
16
- const columnFromFillerBegin = 10;//転記元データの不要な列の開始列:J列
14
+ colFillerBegin: 10, //不要な列の開始列:J列
17
- const columnFromFillerEnd =12;//転記元データの不要な列の終了列:L列
15
+ colFillerEnd: 12, //不要な列の終了列:L列
16
+ };
17
+ const to = { //転記先データ
18
+ rowBegin: 4, //開始列:4行目
19
+ colBegin: 1, //開始列:A列
20
+ colNumber: 6, //番号の列:F列
21
+ };
18
22
  const ss = SpreadsheetApp.getActiveSpreadsheet();
19
- const sheetfrom = ss.getSheetByName(FROM_NAME);
23
+ fr.sheet = ss.getSheetByName(FROM_NAME);
20
- const sheetTo = ss.getSheetByName(TO_NAME);
24
+ to.sheet = ss.getSheetByName(TO_NAME);
21
25
  //転記元データを二次元配列として取得
22
- let fromValues = sheetfrom.getRange(rowFromBegin, columnFromBegin, sheetfrom.getLastRow() - rowFromBegin + 1, columnFromEnd - columnFromBegin + 1).getValues();
26
+ let fromValues = fr.sheet.getRange(fr.rowBegin, fr.colBegin, fr.sheet.getLastRow() - fr.rowBegin + 1, fr.colEnd - fr.colBegin + 1).getValues();
23
27
  //確定となっている要素を抽出
24
- fromValues = fromValues.filter(v => v[columnFromStatus - columnFromBegin] == '確定');
28
+ fromValues = fromValues.filter(v => v[fr.colStatus - fr.colBegin] == '確定');
25
29
  //転記先の番号の列を一元配列として取得
26
- const toValues = sheetTo.getRange(rowToBegin, columnToNumber, sheetTo.getLastRow() - rowToBegin + 1, 1).getValues().flat();
30
+ const toValues = to.sheet.getRange(to.rowBegin, to.colNumber, to.sheet.getLastRow() - to.rowBegin + 1, 1).getValues().flat();
27
31
  //番号が一致している要素を除く
28
32
  if (fromValues.length > 0) {
29
- fromValues = fromValues.filter(f => toValues.every(t => t != f[columnToNumber - columnToBegin]));
33
+ fromValues = fromValues.filter(f => toValues.every(t => t != f[fr.colNumber - fr.colBegin]));
30
34
  }
31
35
  if (fromValues.length > 0) {
32
36
  //不要な列の要素を除く
33
- fromValues.forEach(f => f.splice(columnFromFillerBegin - columnFromBegin, columnFromFillerEnd - columnFromFillerBegin + 1));
37
+ fromValues.forEach(f => f.splice(fr.colFillerBegin - fr.colBegin, fr.colFillerEnd - fr.colFillerBegin + 1));
34
38
  //転記先シートの最終行に記入
35
- sheetTo.getRange(sheetTo.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues);
39
+ to.sheet.getRange(to.sheet.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues);
36
40
  }
37
41
  }
38
42
  ```

2

誤記訂正

2023/07/27 01:38

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -30,7 +30,7 @@
30
30
  }
31
31
  if (fromValues.length > 0) {
32
32
  //不要な列の要素を除く
33
- fromValues.forEach(f => f.splice(col).splice(columnFromFillerBegin - columnFromBegin, columnFromFillerEnd - columnFromFillerBegin + 1));
33
+ fromValues.forEach(f => f.splice(columnFromFillerBegin - columnFromBegin, columnFromFillerEnd - columnFromFillerBegin + 1));
34
34
  //転記先シートの最終行に記入
35
35
  sheetTo.getRange(sheetTo.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues);
36
36
  }

1

マジックナンバーの解消等の修正をしました。

2023/07/27 01:35

投稿

YellowGreen
YellowGreen

スコア868

test CHANGED
@@ -1,7 +1,43 @@
1
- 例えば次のようなスクリプトでしょうか。
1
+ 例えば次のようなスクリプトでしょうか。(修正案をアップしました。)
2
- 取り急ぎ作成したので、
3
- 画像シートの行、列、配列のインデックスを数値のまま(いわゆるマジックナンバーのまま)使っていま
2
+ 当初の例で画像シートの行、列、配列のインデックスを数値のまま(いわゆるマジックナンバーのまま)使っていました
3
+ また、転記する列がM列以降となっていたので、N列以降は転記しないように改めました。
4
+ 行、列を指定する変数名が多くなりました。
5
+ 変数の名前は、右クリックの「シンボル名変更 F2」で適当に修正してみてください。
4
6
 
7
+ ```JavaScript
8
+ function myFunction() {
9
+ const rowFromBegin = 5;//転記元データの開始行:5行目
10
+ const columnFromBegin = 2;//転記元データの開始列:B列
11
+ const columnFromEnd = 13;//転記元データ最終列この列以降は不要:M列
12
+ const rowToBegin = 4;//転記先データの開始列:4行目
13
+ const columnToBegin = 1;//転記先データの開始列:A列
14
+ const columnFromStatus = 5;//転記元データのステータスの列:E列
15
+ const columnToNumber = 6;//転記先データの番号の列:F列
16
+ const columnFromFillerBegin = 10;//転記元データの不要な列の開始列:J列
17
+ const columnFromFillerEnd =12;//転記元データの不要な列の終了列:L列
18
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
19
+ const sheetfrom = ss.getSheetByName(FROM_NAME);
20
+ const sheetTo = ss.getSheetByName(TO_NAME);
21
+ //転記元データを二次元配列として取得
22
+ let fromValues = sheetfrom.getRange(rowFromBegin, columnFromBegin, sheetfrom.getLastRow() - rowFromBegin + 1, columnFromEnd - columnFromBegin + 1).getValues();
23
+ //確定となっている要素を抽出
24
+ fromValues = fromValues.filter(v => v[columnFromStatus - columnFromBegin] == '確定');
25
+ //転記先の番号の列を一元配列として取得
26
+ const toValues = sheetTo.getRange(rowToBegin, columnToNumber, sheetTo.getLastRow() - rowToBegin + 1, 1).getValues().flat();
27
+ //番号が一致している要素を除く
28
+ if (fromValues.length > 0) {
29
+ fromValues = fromValues.filter(f => toValues.every(t => t != f[columnToNumber - columnToBegin]));
30
+ }
31
+ if (fromValues.length > 0) {
32
+ //不要な列の要素を除く
33
+ fromValues.forEach(f => f.splice(col).splice(columnFromFillerBegin - columnFromBegin, columnFromFillerEnd - columnFromFillerBegin + 1));
34
+ //転記先シートの最終行に記入
35
+ sheetTo.getRange(sheetTo.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues);
36
+ }
37
+ }
38
+ ```
39
+
40
+ (当初の提案:N列以降も転記される)
5
41
  ```JavaScript
6
42
  function myFunction() {
7
43
  const ss = SpreadsheetApp.getActiveSpreadsheet();