LFOHP
@LFOHP (PHOFL)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GAS 列の操作

Q&A

解決したいこと

GASで特定の列だけ取得、あるいは不要な列を削除

発生している問題・エラー

エラーではないです

例)
このようなシートデータがあります。(A-Eは見出し)
下記のGASだとvaluesに二次元配列で格納されるのですが、
C列だけ、あるいはD,E,G列が不要なときに、削除したい。

sheet data
A|B|C|D|E|F|G
11|12|13|14|15|16|17
21|22|23|24|25|26|27

```GAS
values =[
[A,B,C,D,E,F,G],
[11,12,13,14,15,16,17],
[21,22,23,24,25,26,27]
]



### 該当するソースコード
```GAS
const ss = SpreadsheetApp.openById("####").getActiveSheet();
const values = ss.getDataRange().getValues()

自分で試したこと

見出しの行削除は、values.shift();でできるのですが、処理したいのは「行」ではなく「列」
values[0].shift();で[A,11,21]は削除できました。

0

2Answer

Array#splice() で指定したインデックスの要素が削除できます。削除したい列のインデックスを使ってすべての行を splice すれば列を削除したことになります。

const ss = SpreadsheetApp.openById("####").getActiveSheet();
const values = ss.getDataRange().getValues();

// 見出しに対応する配列インデックスを取得
const columnsToRemove = ["D", "E", "G"];
const indicesToRemove = columnsToRemove.map((n) => values[0].indexOf(n));

// 小さいインデックスから削除すると後ろのインデックスがずれてしまうので、大きい順に並び替える
indicesToRemove.sort();
indicesToRemove.reverse();

// すべての行について指定したインデックスの要素を削除
valeus.forEach((row) => {
    indicesToRemove.forEach((i) => {
        row.splice(i, 1);
    });
});
0Like

Comments

  1. @LFOHP

    Questioner

    ありがとうございます。

残す列のインデックスを取得して各行を更新する方法も考えられますね。

const values = [
  ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
  [11, 12, 13, 14, 15, 16, 17],
  [21, 22, 23, 24, 25, 26, 27],
];

// 削除する列
const delColumns = ['C', 'E', 'F'];

// 残す列のインデックスを取得
const colIndexes = values[0].
  filter(v => !delColumns.includes(v)).
  map(v => values[0].indexOf(v));

// 各行を更新
for(const row in values) {
  values[row] = colIndexes.map(v => values[row][v]);
}

console.log(values);
  // [ [ 'A', 'B', 'D', 'G' ],
  //   [ 11, 12, 14, 17 ],
  //   [ 21, 22, 24, 27 ] ]
~~~
0Like

Comments

  1. @LFOHP

    Questioner

    ありがとうございます。

Your answer might help someone💌