想定シーン
下記のようなテーブルの特定の列に対して何か処理をしたい時
例えば氏名
の列を1行ずつ確認し、該当の氏名
の場合のみ何か処理を行うには氏名
の列番号を取得しておく必要があります。
コード.gs
const nameColumn = 3; // 氏名の列番号が必要
for (let row=firstRow; row<=lastRow; row++) {
if (sheet.getRange(row, nameColumn).getValue() == "対象の氏名"){
// 処理
}
}
問題点
コード.gs
const nameColumn = 3;
上記のように列番号を直接指定してしまうと列が追加されたり、削除された場合に思わぬ不具合を招いてしまいます。
解決策
カラム名を指定して該当する列番号を返すような関数を作ってみました。
コード.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;
}
これで列の増減にも対応が可能になりました。
カラム名が変更された場合にもアラートが表示されるようになっています。
改善点
まだ引数が多い(ヘッダーの行番号と開始列を指定する必要がある)ところがすっきりしない感じがするのでいい方法がありましたらご教示いただけると幸いです。