0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GAS】列の追加・削除に対応する柔軟なコードを書きたい

Posted at

想定シーン

下記のようなテーブルの特定の列に対して何か処理をしたい時
qiita_s1.png
例えば氏名の列を1行ずつ確認し、該当の氏名の場合のみ何か処理を行うには氏名の列番号を取得しておく必要があります。

コード.gs
const nameColumn = 3; // 氏名の列番号が必要
for (let row=firstRow; row<=lastRow; row++) {
    if (sheet.getRange(row, nameColumn).getValue() == "対象の氏名"){
        // 処理
    }
}

問題点

コード.gs
const nameColumn = 3;

上記のように列番号を直接指定してしまうと列が追加されたり、削除された場合に思わぬ不具合を招いてしまいます。

qiita_s2.png

解決策

カラム名を指定して該当する列番号を返すような関数を作ってみました。

コード.gs
/**
* 指定したカラム名の列番号を返す
* @params {sheet} sheet 対象のシート
* @params {num} headerRow ヘッダ-(見出し)の行
* @params {num} firstColumn ヘッダー開始列
* @params {string} columnName カラム名
* @return {num|boolean} column|false 列番号/見つからない場合false
*/
function getColumnByName(sheet, headerRow, firstColumn, columnName) {
    const lastColumn = sheet.getLastColumn();
    // 見出し配列を取得(二次元配列で取得されるため添字0指定)
    const headers = sheet.getRange(headerRow, firstColumn, 1, lastColumn - firstColumn + 1).getValues()[0];
    // カラム名の添字を取得
    const columnIndex = headers.indexOf(columnName);
    // カラム名が見つからない場合はアラート表示後falseを返す
    if (columnIndex == -1) {
        SpreadsheetApp.getUi().alert(columnName + "列が見つかりません");
        return false;
    }
    // 列番号(配列の添字とヘッダー開始列番号を足す)を返す
    return firstColumn + columnIndex;
}

これで列の増減にも対応が可能になりました。
カラム名が変更された場合にもアラートが表示されるようになっています。

改善点

まだ引数が多い(ヘッダーの行番号と開始列を指定する必要がある)ところがすっきりしない感じがするのでいい方法がありましたらご教示いただけると幸いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?