「Officeスクリプトで、最終行・最終列を取得するにはどうやればいいの…」
そのように悩んでいませんか?
・getUsedRange() メソッドを使用すると、
書式が設定されたセルや空白セルも「使用されているセル」と
認識されてしまう。
・正確な最終行・最終列を取得する方法が知りたい。
今回は、Officeスクリプトの「最終行・最終列の求め方」について
解説します!
この記事では、Officeスクリプトで最終行・最終列をgetUsedRange()で取得する方法と、関数を作成して正確に取得する方法について解説し、それぞれの注意点や対策も紹介します。
最終行・最終列を正確に取得することで、データの一括処理や新規データの追加位置の特定が簡単になり、効率的なデータ操作が可能です。
また、不要な空白行や空白列を無視して正確なデータ範囲を活用できるため、スクリプトの安定性も向上します。
関数化して使用できる便利なコード例も提供しますので、ぜひ最後までお読みください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を読むと「できるようになる」こと
この記事を読むことで、次のことができるようになります。
- 最終行・最終列を取得すると何ができるのか?確認する
- OfficeスクリプトのgetUsedRange()メソッドの基本を習得する
- getUsedRange()メソッドの限界を知り、最終行・最終列を取得する関数を作成する
- getUsedRange()メソッドの実際の使用例を確認する
最終行・最終列を取得するメリットとは?
Officeスクリプトで最終行や最終列を取得することで、データの扱いがより効率的になります。
ここでは、取得することによって得られる主なメリットを簡単にご紹介します。
機能・効果 | 説明 |
---|---|
データの自動更新 | 最終行・最終列を取得することで、新しいデータの入力位置を特定し、 既存のデータ範囲に自動的に追加できます。 |
繰り返し処理の効率化 | データ範囲を正確に把握することで、データ全体の一括処理や セル操作の自動化が簡単になります。 |
空白セルの処理を 最小限にする | getUsedRange()の制限を避け、正確な最終行・最終列のデータのみを 扱うことで、無駄な空白セルを含めずに効率的な操作が可能です。 |
最終行・最終列を取得する方法を学ぶことで、こうした便利な操作が可能になり、データ処理の精度や作業効率が大幅に向上します。
それでは、取得方法の具体例を見ていきましょう。
OfficeスクリプトのgetUsedRange()メソッドの基本 | 最終行・最終列を求める
Officeスクリプトでは、シート内で最終行や最終列を求めるために「getUsedRange() メソッド」を使用します。
このメソッドにより、シート内の「使用されているセルの範囲」を取得し、その中から最終行や最終列を特定できます。
ただし、空白セルが多いシートでは、このメソッドだけでは意図した範囲を取得できない場合もあるため、getLastRow()
やgetLastColumn()
などの他のメソッドと併用することが有効です。
最終行・最終列を取得するメソッドの解説
最終行・最終列を取得する際に使用する主なメソッドは次の通りです。
対象 | メソッド名 | 説明 |
---|---|---|
両方 | getUsedRange() | シート内で「データが存在する範囲」を取得します。 この範囲は、データのあるセルだけでなく、書式が設定された空白セルも含みます。 |
行 | getLastRow() | 使用されている範囲内の最終行のインデックスを取得します。 インデックスは 0 ベースのため、実際の行番号には1を足します。 |
列 | getLastColumn() | 使用されている範囲内の最終列のインデックスを取得します。 インデックスは 0 ベースなので、列番号にも1を足します。 |
行 | getRowCount() | データが存在する行の数を取得するメソッドです。 |
列 | getColumnCount() | データが存在する列の数を取得するメソッドです。 |
最終行・最終列を取得するメソッドの使用例
【最終行・最終列】getUsedRange()
を使ってシートの使用範囲を取得
getUsedRange()
は、シート上でデータが存在する範囲全体を取得するメソッドです。
このメソッドでは、セルにデータが含まれている場所だけでなく、書式が設定されている空白セルも含まれます。
使用範囲がどこまでかを確認したい場合に便利です。
コード
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// シート全体でデータが存在する範囲を取得
let usedRange: ExcelScript.Range = sheet.getUsedRange();
console.log(`使用範囲: ${usedRange.getAddress()}`); // 範囲のアドレスを出力
}
結果
解説
このコードの結果はSheet1!A1:E6
となります。
getUsedRange()
により、A1:E6
の範囲が取得され、範囲のアドレスが出力されます。
【最終行】getLastRow()
を使って最終行のインデックスを取得
getLastRow()
を使うことで、使用範囲内の最終行の範囲オブジェクトが取得されます。
また、このオブジェクトから実際のインデックス(数値)を取得するためには、getRowIndex()
を併用する必要があります。
getRowIndex()
を付けない場合、オブジェクトそのものが返されてしまいますので、注意が必要です。
コード
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 使用範囲内の最終行のインデックスを取得
let lastRow: number = sheet.getUsedRange().getLastRow().getRowIndex();
console.log(`最終行 (インデックス): ${lastRow}`); // 最終行のインデックスを出力
console.log(`最終行 (行番号): ${lastRow + 1}`); // Excel行番号に合わせて+1
}
結果
解説
getLastRow()
に getRowIndex()
を付けることで、実際の最終行のインデックス(0ベース)が取得できます。
上記の例では、最終行は5(Excelの行番号では6行目)です。
Excelの行番号に合わせるにはインデックスに1を足す必要があります。
【最終列】getLastColumn()
を使って最終列のインデックスを取得
getLastColumn()
を使うと、使用範囲内の最終列の範囲オブジェクトが返されます。
このオブジェクトからインデックス(数値)を取得するためには、getColumnIndex()
を併用する必要があります。
getColumnIndex()
を付けない場合、オブジェクト自体が返されるため、最終列の数値を取得したい場合は必ず getColumnIndex()
を使用しましょう。
コード
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 使用範囲内の最終列のインデックスを取得
let lastColumn: number = sheet.getUsedRange().getLastColumn().getColumnIndex();
console.log(`最終列 (インデックス): ${lastColumn}`); // 最終列のインデックスを出力
console.log(`最終列 (列番号): ${lastColumn + 1}`); // Excel列番号に合わせて+1
}
結果
解説
getLastColumn()
に getColumnIndex()
を付けることで、最終列のインデックス(0ベース)が取得できます。
例では最終列が4(Excelの列番号では5列目)です。
Excelの列番号に合わせるには、インデックスに1を足します。
【最終行】getRowCount()
を使って使用範囲内の行数を取得
getRowCount()
メソッドは、シート上で「使用されている範囲の行数」を取得します。
最終行ではなく、使用されている範囲の「総行数」を確認したい場合に便利です。
コード
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 使用範囲内の行の数を取得
let rowCount: number = sheet.getUsedRange().getRowCount();
console.log(`行数: ${rowCount}`); // 使用範囲内の行数を出力
}
結果
解説
この結果は、シートの使用範囲の行数は「6」と取得されています。
A1:E6
が範囲であれば、使用されている行数は「6行」です。
【最終列】getColumnCount()
を使って使用範囲内の列数を取得
getColumnCount()
メソッドは、シート上で「使用されている範囲の列数」を取得します。
最終列ではなく、使用されている範囲の「総列数」を確認したい場合に使います。
コード
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 使用範囲内の列の数を取得
let columnCount: number = sheet.getUsedRange().getColumnCount();
console.log(`列数: ${columnCount}`); // 使用範囲内の列数を出力
}
結果
解説
上記の例では、シートの使用範囲が A1:E6
の場合、範囲の列数は「5」と取得されます。
このように、getColumnCount()
で範囲内の総列数を簡単に確認できます。
注意ポイント | getUsedRange()メソッドで取得できる最終行・最終列の限界
getUsedRange()
メソッドは、書式設定された空白セルや空白のままのセルも「使用されているセル」として認識するため、最終行や最終列がすれて思ったように取得できないことがあります。
【注意】 getUsedRange() メソッドで意図しない範囲が取得される例
たとえば、シート内の A1:E6
の範囲にデータが入力されているとします。
また、以下のような状態になっている場合を考えます
- セル「C7」に書式設定がされている(セルにデータはなし)
- セル「F1」に空白スペースが入力されている
このような場合、本来のデータ範囲は A1:E6
のみですが、getUsedRange()
メソッドは書式設定されたセルや空白スペースの入力されたセルも「使用されているセル」として認識します。
そのため、意図しない範囲である A1:F7
までが「使用範囲」として取得されてしまいます。
コード例 : getUsedRange() メソッドで意図しない範囲が取得される例
function main(workbook: ExcelScript.Workbook) {
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// getUsedRange()でシートの使用範囲を取得
let usedRange: ExcelScript.Range = sheet.getUsedRange();
console.log(`使用範囲 (getUsedRange): ${usedRange.getAddress()}`); // 範囲のアドレスを出力
}
詳細結果
解説
上記のコードでは、getUsedRange()
メソッドが A1:F7
までの範囲を取得していますが、実際のデータ範囲は A1:E6
です。
これは、書式設定されたセル「C7」や空白スペースが入力されたセル「F1」が使用範囲として含まれてしまったためです。
このように、getUsedRange()
メソッドだけでは意図したデータ範囲が正確に取得できないケースがあるため、必要に応じて他のメソッドや関数を使用して、正確なデータ範囲を特定するのが推奨されます。
【対策:関数を作成】関数を使用して最終行・最終列を空白セルや書式セルを無視して取得する
以下のコードでは、シートの実際の最終行・最終列を取得するために、空白セルや書式のみのセルを無視して最終行・最終列を取得する関数を紹介します。
最終行を取得する関数:getLastDataRow()
この関数では、getValues()
で取得したセルの値を確認し、行内に少なくとも1つデータが含まれていればそれを最終行として認識します。
この関数ではnull
やundefined
、空文字(""
)といった、データが空のセルのみを無視する条件を設けることで、より柔軟なエラーチェックができるようにしています。
⇒ 詳細な解説は、「使用例2: 関数を使用し、正確な最終行を取得する」をご覧ください。
// ↓ 正確に最終行を求める関数 (空白スペースと書式を無視)
function getLastDataRow(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startRow: number = usedRange.getRowIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = rowCount - 1; i >= 0; i--) {
let rowIndex: number = startRow + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
let values = range.getValues()[0];
// 行内の各セルをチェック
if (values.some(cell => {
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return rowIndex + 1;
}
}
return 0;
}
最終列を取得する関数:getLastDataColumn()
この関数では、getValues()
で取得したセルの値を確認し、列内に少なくとも1つデータが含まれていればそれを最終列として認識します。
この関数ではnull
やundefined
、空文字(""
)といった、データが空のセルのみを無視する条件を設けることで、より柔軟なエラーチェックができるようにしています。
⇒ 詳細な解説は、「使用例3: 関数を使用し、正確な最終列を取得する」をご覧ください。
// ↓ 正確に最終列を求める関数 (空白スペースと書式を無視)
function getLastDataColumn(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startColumn: number = usedRange.getColumnIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = columnCount - 1; i >= 0; i--) {
let columnIndex: number = startColumn + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(0, columnIndex, rowCount, 1);
let values = range.getValues();
// 列内の各セルをチェック
if (values.some(row => {
let cell = row[0];
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return columnIndex + 1;
}
}
return 0;
}
呼び出し手順の要約
以下のコードを使用することで、getLastDataRow()
および getLastDataColumn()
関数を呼び出し、シート内で正確な最終行・最終列を取得することができます。
- 先ほどの関数「getLastDataRow」と 「getLastDataColumn」をコピーし、スクリプトに追加します。
- 「main関数」からこれらの関数を呼び出して、シートの最終行・最終列を取得します。
function main(workbook: ExcelScript.Workbook) {
// 1. シートを取得
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 2. 最終行と最終列を取得
let lastRow: number = getLastDataRow(sheet);
let lastColumn: number = getLastDataColumn(sheet);
// 3. 結果を出力
console.log(`実際の最終行: ${lastRow}`);
console.log(`実際の最終列: ${lastColumn}`);
}
OfficeスクリプトのgetUsedRange()メソッドで最終行・最終列を求める使用例
それでは、最終行・最終列を求める使用例を紹介します。
以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。
まず、本使用例については、次のエクセルの表を使用して、最終行・最終列を取得しています。
まずはこちらをご覧ください。
- セル「A5」に、半角スペースが入力されています。
- セル「E1」は、透明な塗りつぶしがされています。
Officeスクリプトの基礎から応用までを効率よくしっかり学習したい方には、UdemyのOfficeスクリプト講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。
使用例1: getUsedRange()メソッドで、最終行・最終列を取得する
この例では、Officeスクリプトの getUsedRange()
メソッドを使い、シート内の「使用されている範囲」を取得し、その結果を確認します。
コード内では getRowCount()
と getColumnCount()
メソッドで範囲の行数・列数を取得し、さらに getLastRow()
および getLastColumn()
を使って最終行・最終列のインデックスも取得します。
コード例 | getUsedRange() での範囲取得
function main(workbook: ExcelScript.Workbook) {
// シートを取得
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 使用されている範囲(used range)を取得
let usedRange: ExcelScript.Range = sheet.getUsedRange();
// 最終行と最終列を getRowCount() と getColumnCount() で取得
let lastRowByCount: number = usedRange.getRowCount();
let lastColumnByCount: number = usedRange.getColumnCount();
// 最終行と最終列を getLastRow() と getLastColumn() で取得
let lastRowByIndex :number = usedRange.getLastRow().getRowIndex(); // 行インデックスを取得
let lastColumnByIndex :number = usedRange.getLastColumn().getColumnIndex(); // 列インデックスを取得
// 結果をログに出力
console.log("getRowCount() 最終行: " + lastRowByCount);
console.log("getColumnCount() 最終列: " + lastColumnByCount);
console.log("getLastRow() 最終行: " + (lastRowByIndex + 1)); // 行番号はインデックス + 1
console.log("getLastColumn() 最終列: " + (lastColumnByIndex + 1)); // 列番号はインデックス + 1
}
処理結果
コードの動作概要
getWorksheet("Sheet1")
で指定したシート “Sheet1” を取得し、getUsedRange()
でそのシート内の「使用範囲」を取得しています。getUsedRange()
はデータが入力されたセルだけでなく、書式設定されたセルや半角スペースが入力されたセルも含むため、意図しない範囲が使用範囲として取得されることがあります。
getRowCount()
と getColumnCount()
を使い、使用範囲の行数と列数を取得しています。getRowCount()
で「使用範囲内の行数」を、getColumnCount()
で「使用範囲内の列数」を取得できます。
上記の前提条件では、getUsedRange()
により A1:E5
が範囲として認識されているため、行数は5、列数は5が返されます。
getLastRow()
と getLastColumn()
で最終行・最終列のセルオブジェクトを取得し、getRowIndex()
と getColumnIndex()
で行と列のインデックスを取得しています。getRowIndex()
と getColumnIndex()
は0ベースのインデックスを返すため、実際の行番号・列番号として使用するにはそれぞれに「+1」する必要があります。
console.log()
により、取得した行数・列数および最終行・最終列のインデックスをコンソールに出力しています。
実際のデータがあるのは A1:D4
ですが、A5
のスペースと E1
の書式設定が影響し、A1:E5
が「使用範囲」として取得されていることが確認できます。
このコードで使用している機能
- let (変数)
- console.log (値の出力)
- 指定した内容をコンソールに表示します。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数は「workbook」パラメータを通じてExcelのワークブック全体を操作します。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getWorksheet(“Sheet1”);
- getWorksheet(“Sheet1”) で指定したシート “Sheet1” を取得し、変数「sheet」に格納します。
この変数で特定のシートを操作できるようになります。
- getWorksheet(“Sheet1”) で指定したシート “Sheet1” を取得し、変数「sheet」に格納します。
- let usedRange: ExcelScript.Range = sheet.getUsedRange();
- getUsedRange() メソッドを使用し、シート内で「使用されている範囲」を取得しています。
この「使用範囲」は、データが入力されているセルだけでなく、書式設定されたセルや半角スペースが入力されたセルも含むため、実際のデータ範囲よりも広くなる場合があります。
- getUsedRange() メソッドを使用し、シート内で「使用されている範囲」を取得しています。
- let lastRowByCount: number = usedRange.getRowCount();
- getRowCount() メソッドを使って、使用範囲内の行数を取得し、変数「lastRowByCount」に格納します。
getUsedRange() で取得された範囲が「A1:E5」の場合、この値は「5」になります。
- getRowCount() メソッドを使って、使用範囲内の行数を取得し、変数「lastRowByCount」に格納します。
- let lastColumnByCount: number = usedRange.getColumnCount();
- getColumnCount() メソッドを使用して、使用範囲内の列数を取得し、変数「lastColumnByCount」に格納します。
取得範囲が「A1:E5」の場合、列数は「5」です。
- getColumnCount() メソッドを使用して、使用範囲内の列数を取得し、変数「lastColumnByCount」に格納します。
- let lastRowByIndex: number = usedRange.getLastRow().getRowIndex();
- getLastRow() で使用範囲内の最終行を取得し、さらに getRowIndex() メソッドを使ってその行のインデックス(0ベース)を取得しています。
行番号として表示するには +1 が必要です。
- getLastRow() で使用範囲内の最終行を取得し、さらに getRowIndex() メソッドを使ってその行のインデックス(0ベース)を取得しています。
- let lastColumnByIndex: number = usedRange.getLastColumn().getColumnIndex();
- getLastColumn() で使用範囲内の最終列を取得し、getColumnIndex() メソッドで列インデックスを取得しています。
こちらも0ベースで返されるため、列番号として使用する場合は +1 が必要です。
- getLastColumn() で使用範囲内の最終列を取得し、getColumnIndex() メソッドで列インデックスを取得しています。
- console.log(“getRowCount() 最終行: ” + lastRowByCount);
- getRowCount() で取得した行数をコンソールに出力します。
例では「A1:E5」で使用範囲が認識されているため、出力は「5」になります。
- getRowCount() で取得した行数をコンソールに出力します。
- console.log(“getColumnCount() 最終列: ” + lastColumnByCount);
- getColumnCount() で取得した列数をコンソールに出力します。
この例では「5」が出力されます。
- getColumnCount() で取得した列数をコンソールに出力します。
- console.log(“getLastRow() 最終行: ” + (lastRowByIndex + 1));
- getLastColumn() で取得した最終列インデックスに +1 を加え、列番号として出力します。
- console.log(“getLastColumn() 最終列: ” + (lastColumnByIndex + 1));
- getLastColumn() で取得した最終列インデックスに +1 を加え、列番号として出力します。
- }
- 関数「main」の終了を示しています。
総括・ポイント
getUsedRange()
は、データが入力されていないセルに対しても書式設定や空白入力があれば「使用されているセル」として認識するため、実際のデータ範囲よりも広い範囲を取得する可能性があります。
そのため、正確な最終行や最終列を取得するには、空白セルや書式設定を無視した取得方法を検討する必要があります。
⇒ 「最終行・最終列を取得するメソッドの解説」をもう一度見る
使用例2: 関数を使用し、正確な最終行を取得する
この例では、作成した関数「getLastDataRow() 」を使用して、空白 (スペース) セルや書式設定のみのセルを無視し、実際にデータが入力されている最終行を正確に取得する方法を紹介します。
この関数は、シートの最終行から逆順でデータが存在するセルをチェックすることで、効率的に最終行を特定する設計になっています。
コード例 | 正確な最終行を取得する関数「getLastDataRow()」
function main(workbook: ExcelScript.Workbook) {
// シートを取得
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 正確な最終行を取得する関数を呼び出し
let lastRow: number = getLastDataRow(sheet);
// 最終行を出力
console.log(`実際の最終行: ${lastRow}`);
}
// ↓ 空白スペースと書式を無視して正確に最終行を求める関数
function getLastDataRow(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startRow: number = usedRange.getRowIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = rowCount - 1; i >= 0; i--) {
let rowIndex: number = startRow + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
let values = range.getValues()[0];
// 行内の各セルをチェック
if (values.some(cell => {
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return rowIndex + 1;
}
}
return 0;
}
処理結果
コードの動作概要
getUsedRange()
メソッドを使用してシートの「使用範囲」を取得し、そこから範囲の行数を取得して rowCount
に格納しています。
※getUsedRange()
は、データが入力されているセルだけでなく、書式設定されたセルや空白スペースが入力されたセルも「使用範囲」に含むため、実際のデータ範囲よりも広い範囲が取得される場合があります。
ループで最終行から上に向かって1行ずつ確認し、データが含まれているかをチェックします。getRangeByIndexes(rowIndex, 0, 1, ...)
により、各行全体を取得し、getValues()
で行内のセル値を配列として取り出します。
これにより、行内にデータがあるかどうかをチェックすることができます。
some()
メソッドで行内のいずれかのセルにデータが存在するか確認します。データが空 (null
、undefined
、空文字 ""
) の場合は無視し、それ以外であればデータがあると判定します。
データが含まれるセルが見つかった場合、その行インデックス rowIndex
に +1
した行番号を返します。
ループが完了してもデータが見つからない場合、シートにデータが全くないことを示すため 0
を返します。
データがない場合の処理を定義することで、シートが空の場合に対応します。
このコードで使用している機能
- let (変数)
- console.log (値の出力)
- 指定した内容をコンソールに表示します。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数は、workbook オブジェクトを通してExcelワークブックを操作し、実際の最終行を確認するために getLastDataRow() 関数を呼び出します。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet : ExcelScript.Worksheet = workbook.getWorksheet(“Sheet1”);
- getWorksheet(“Sheet1”) を使用して、ワークブック内の “Sheet1” という名前のシートを取得し、「sheet」という変数に格納します。
この変数「sheet」を介してシート内での操作が可能になります。
- getWorksheet(“Sheet1”) を使用して、ワークブック内の “Sheet1” という名前のシートを取得し、「sheet」という変数に格納します。
- let lastRow : number = getLastDataRow(sheet);
- getLastDataRow(sheet) 関数を呼び出し、取得した sheet オブジェクトを引数として渡します。
この関数は、シート内で実際にデータが存在する最終行の番号を返し、変数「lastRow」に格納します。
- getLastDataRow(sheet) 関数を呼び出し、取得した sheet オブジェクトを引数として渡します。
- console.log(実際の最終行: ${lastRow});
- console.log() メソッドを使って、取得した「lastRow(実際の最終行番号)」をコンソールに出力します。
getLastDataRow() 関数が返す結果をここで確認することができます。
- console.log() メソッドを使って、取得した「lastRow(実際の最終行番号)」をコンソールに出力します。
- }
- 関数「main」の終了を示しています。
■ getLastDataRow 関数の詳細解説
- function getLastDataRow(sheet: ExcelScript.Worksheet): number {
- 関数「getLastDataRow」を定義しています。
この関数は、引数として渡された sheet(シート)内で、データが入力されている最終行の番号を取得して返します。戻り値の型は「number」です。
- 関数「getLastDataRow」を定義しています。
- let usedRange: ExcelScript.Range = sheet.getUsedRange();
- 「sheet.getUsedRange()」を使用して、シート全体の「使用範囲」を取得し、「usedRange」に格納します。
この範囲にはデータが入力されたセルのほか、書式設定された空白セルも含まれることがあります。
- 「sheet.getUsedRange()」を使用して、シート全体の「使用範囲」を取得し、「usedRange」に格納します。
- if (!usedRange) return 0;
- 「usedRange」が空(データが一切ないシート)である場合、「0」を返して関数を終了します。
これにより、データがない場合でもエラーを回避できます。
- 「usedRange」が空(データが一切ないシート)である場合、「0」を返して関数を終了します。
- let startRow: number = usedRange.getRowIndex();
- 「usedRange」の開始行インデックスを取得し、「startRow」に格納します。
この行インデックスは「0」ベースのため、Excelの実際の行番号とは異なります。
- 「usedRange」の開始行インデックスを取得し、「startRow」に格納します。
- let rowCount: number = usedRange.getRowCount();
- 「usedRange」の行数を取得し、「rowCount」に格納します。
この行数は「使用範囲の総行数」を表しています。
- 「usedRange」の行数を取得し、「rowCount」に格納します。
- let columnCount: number = usedRange.getColumnCount();
- 「usedRange」の列数を取得し、「columnCount」に格納します。
これで「使用範囲の総列数」を取得できます。
- 「usedRange」の列数を取得し、「columnCount」に格納します。
- for (let i: number = rowCount – 1; i >= 0; i–) {
- 「rowCount – 1」から「0」まで、1行ずつ上に向かってデータの有無を確認するループを開始します。
最終行からチェックすることで、効率よく最終行を特定します。
- 「rowCount – 1」から「0」まで、1行ずつ上に向かってデータの有無を確認するループを開始します。
- let rowIndex: number = startRow + i;
- 現在の行インデックスを「startRow」に「i」を加えて計算し、「rowIndex」に格納します。
この値はExcelの「0」ベースのインデックスで表されています。
- 現在の行インデックスを「startRow」に「i」を加えて計算し、「rowIndex」に格納します。
- let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
- 「sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount)」を使用し、特定行の全列を範囲として取得します。
「range」は「rowIndex」行全体のセルデータを参照します。
- 「sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount)」を使用し、特定行の全列を範囲として取得します。
- let values = range.getValues()[0];
- 「getValues()」で「range」内のセル値を「1」行分の配列として取得し、「values」に格納します。
- if (values.some(cell => { … })) {
- some() メソッドを使用して、「values」配列の各セルをチェックし、行内のいずれかにデータがあるかを確認します。
条件を満たすセルが見つかれば、some() は「true」を返し、if 文の中に処理が移ります。
- some() メソッドを使用して、「values」配列の各セルをチェックし、行内のいずれかにデータがあるかを確認します。
- if (cell === null || cell === undefined) { return 0; }
- 各セルの値が「null」または「undefined」である場合、データがないものとして「0」を返します。
「null」や「undefined」は「データが空のセル」とみなされるため、この条件に当てはまる場合はデータがないと判断します。
- 各セルの値が「null」または「undefined」である場合、データがないものとして「0」を返します。
- if (typeof cell === ‘string’) { return cell.trim() !== “”; }
- セルが文字列の場合、trim() メソッドで前後の空白を除去し、その結果が空文字列でないかをチェックします。
空白だけの文字列セルをデータなしとみなすため、このチェックが行われています。- true
- データが含まれていると判定します。
- false
- 空白だけのセルとして、データなしと判定します。
- true
- セルが文字列の場合、trim() メソッドで前後の空白を除去し、その結果が空文字列でないかをチェックします。
- return true;
- 文字列以外の型(数値、ブール値など)はデータがあるとみなされるため、「true」を返します。
データの有無を確認するためのチェックであり、文字列以外のセルがあればデータありと判定します。
- 文字列以外の型(数値、ブール値など)はデータがあるとみなされるため、「true」を返します。
- return rowIndex + 1;
- 行内にデータが見つかった場合、その行インデックス「rowIndex」に「+1」を加え、Excel の行番号に合わせて返します。
ここでの「+1」は、Excel の行番号が「1」ベースであるため、「0」ベースの「rowIndex」に「1」を足して調整しています。
- 行内にデータが見つかった場合、その行インデックス「rowIndex」に「+1」を加え、Excel の行番号に合わせて返します。
- return 0;
- ループが終了してもデータが見つからなかった場合、シートが空であるとみなし「0」を返します。
データがないシートに対応するための処理です。
- ループが終了してもデータが見つからなかった場合、シートが空であるとみなし「0」を返します。
- }
- 関数「getLastDataRow」の終了を示しています。
総括・ポイント
このコード例では、シートの最終行から上に向かって各行を順に確認することで、データが存在する最終行を特定しています。
getUsedRange()
メソッドで取得される範囲には、書式設定や空白セルも含まれてしまうため、このコードでは関数 getLastDataRow()
を使用して、実際にデータが入力されているセルのみを考慮しています。
最終行を取得する際に、データの行を逆から確認する理由
このコードがシートの最終行から確認を開始する理由は、最も下にあるデータをすばやく見つけるためです。
上から順に確認する場合、すべての行を確認する必要がありますが、下から確認すると、最終行が早い段階で見つかった場合、それ以降の確認を省略でき、処理が効率化されます。
使用例3: 関数を使用し、正確な最終列を取得する
この例では、作成した関数「getLastDataColumn()」を使用して、空白(スペース)や書式設定のみのセルを無視し、実際にデータが入力されている最終列を正確に取得する方法を紹介します。
この関数は、シートの最終列から逆順でデータが存在するセルをチェックすることで、効率的に最終列を特定するように設計されています。
コード例 | 正確な最終列を取得する関数「getLastDataColumn()」
function main(workbook: ExcelScript.Workbook) {
// シートを取得
let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1");
// 正確な最終列を取得する関数を呼び出し
let lastColumn: number = getLastDataColumn(sheet);
// 最終列を出力
console.log(`実際の最終列: ${lastColumn}`);
}
// ↓ 空白スペースと書式を無視して正確に最終列を求める関数
function getLastDataColumn(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startColumn: number = usedRange.getColumnIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = columnCount - 1; i >= 0; i--) {
let columnIndex: number = startColumn + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(0, columnIndex, rowCount, 1);
let values = range.getValues();
// 列内の各セルをチェック
if (values.some(row => {
let cell = row[0];
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return columnIndex + 1;
}
}
return 0;
}
処理結果
コードの動作概要
getUsedRange() メソッドでシートの「使用範囲」を取得し、その範囲の列数を取得して columnCount
に格納しています。getUsedRange()
は、データが入力されたセルだけでなく、書式設定や空白セルも「使用範囲」として含むため、実際のデータ範囲よりも広い範囲が取得されることがあります。
ループで最終列から左に向かって1列ずつ確認し、データが含まれているかをチェックします。getRangeByIndexes(0, columnIndex, ...)
により、各列全体を取得し、getValues()
で列内のセル値を配列として取得します。
これにより、列内にデータがあるかどうかをチェックできます。
some()
メソッドで、列内に少なくとも1つデータが入力されているセルがあるかを確認します。
セルの値が null
、undefined
、空文字列 (""
) の場合は無視し、それ以外であれば「データがある」とみなします。
データのあるセルが見つかった場合、その列インデックス columnIndex
に +1
した列番号を返します。
ループが完了してもデータが見つからない場合、シートにデータが全くないことを示すため 0
を返します。
データがない場合の処理を定義することで、シートが空の場合に対応します。
このコードで使用している機能
- let (変数)
- console.log (値の出力)
- 指定した内容をコンソールに表示します。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数は、workbook オブジェクトを通してExcelワークブックを操作し、実際の最終行を確認するために getLastDataRow() 関数を呼び出します。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getWorksheet(“Sheet1”);
- getWorksheet(“Sheet1”) を使用して、ワークブック内の “Sheet1” という名前のシートを取得し、「sheet」という変数に格納します。
この変数「sheet」を介してシート内での操作が可能になります。
- getWorksheet(“Sheet1”) を使用して、ワークブック内の “Sheet1” という名前のシートを取得し、「sheet」という変数に格納します。
- let lastColumn: number = getLastDataColumn(sheet);
- getLastDataColumn(sheet) 関数を呼び出し、取得した sheet オブジェクトを引数として渡します。
この関数は、シート内で実際にデータが存在する最終列の番号を返し、変数「lastColumn」に格納します。
- getLastDataColumn(sheet) 関数を呼び出し、取得した sheet オブジェクトを引数として渡します。
- console.log(実際の最終列: ${lastColumn});
- console.log() メソッドを使って、取得した「lastColumn(実際の最終列番号)」をコンソールに出力します。
getLastDataColumn() 関数が返す結果をここで確認することができます。
- console.log() メソッドを使って、取得した「lastColumn(実際の最終列番号)」をコンソールに出力します。
- }
- 関数「main」の終了を示しています。
■ getLastDataColumn 関数の詳細解説
- function getLastDataColumn(sheet: ExcelScript.Worksheet): number {
- ここからが「getLastDataColumn」関数の定義です。
この関数は、渡された sheet オブジェクトをもとに、データが含まれている最終列の列番号を 「number 型」で返します。
- ここからが「getLastDataColumn」関数の定義です。
- let usedRange: ExcelScript.Range = sheet.getUsedRange();
- 「sheet.getUsedRange()」を使用して、シート内で「使用されている範囲」を取得し、「usedRange」に格納します。
この範囲にはデータが入力されたセルのほか、書式設定された空白セルも含まれます。
- 「sheet.getUsedRange()」を使用して、シート内で「使用されている範囲」を取得し、「usedRange」に格納します。
- if (!usedRange) return 0;
- 「usedRange」が空(シートにデータがない場合)である場合は、「0」を返して関数を終了します。
これにより、データが一切ないシートでもエラーを回避できます。
- 「usedRange」が空(シートにデータがない場合)である場合は、「0」を返して関数を終了します。
- let startColumn: number = usedRange.getColumnIndex();
- 「usedRange」の開始列インデックスを取得し、「startColumn」に格納します。
この列インデックスは「0」ベースのため、Excelの実際の列番号とは異なります。
- 「usedRange」の開始列インデックスを取得し、「startColumn」に格納します。
- let rowCount: number = usedRange.getRowCount();
- 「usedRange」の行数を取得し、「rowCount」に格納します。
これで使用範囲内の総行数を取得できます。
- 「usedRange」の行数を取得し、「rowCount」に格納します。
- let columnCount: number = usedRange.getColumnCount();
- usedRange の列数を取得し、columnCount に格納します。これで使用範囲内の総列数を取得できます。
- for (let i: number = columnCount – 1; i >= 0; i–) {
- 「columnCount – 1」から「0」まで、1列ずつ左方向に向かってデータの有無を確認するループを開始します。
最終列から順に確認することで、効率よく最終列を特定します。
- 「columnCount – 1」から「0」まで、1列ずつ左方向に向かってデータの有無を確認するループを開始します。
- let columnIndex: number = startColumn + i;
- 現在の列インデックスを「startColumn」に「i」を加えて計算し、「columnIndex」に格納します。
この値は「0」ベースのインデックスで表されています。
- 現在の列インデックスを「startColumn」に「i」を加えて計算し、「columnIndex」に格納します。
- let range: ExcelScript.Range = sheet.getRangeByIndexes(0, columnIndex, rowCount, 1);
sheet.getRangeByIndexes(0, columnIndex, rowCount, 1)
を使用し、現在のcolumnIndex
列全体を範囲として取得し、range
に格納します。
この範囲は1列全体のデータを確認するために設定されています。
- let values = range.getValues();
- getValues() メソッドを使って、「range」内のセルデータを2次元配列「values」として取得します。
各セルのデータが配列として格納されており、データの有無を確認できます。
- getValues() メソッドを使って、「range」内のセルデータを2次元配列「values」として取得します。
- if (values.some(row => { … })) {
- some() メソッドを使用し、「values」配列内のセルにデータが含まれているか確認します。
条件を満たすセルが見つかれば some() が「true」を返し、if 文の処理が実行されます。
- some() メソッドを使用し、「values」配列内のセルにデータが含まれているか確認します。
- let cell = row[0];
- 現在の行内にあるセルのデータを「cell」という変数に格納します。
「values」は2次元配列のため、各行の最初の要素(row[0])を取得して確認します。
- 現在の行内にあるセルのデータを「cell」という変数に格納します。
- if (cell === null || cell === undefined) { return 0; }
- セルの値が「null」または「undefined」である場合は、データがないものとして「0」を返します。
「null」や「undefined」は「データが空のセル」とみなされるため、データなしと判断します。
- セルの値が「null」または「undefined」である場合は、データがないものとして「0」を返します。
- if (typeof cell === ‘string’) { return cell.trim() !== “”; }
- セルのデータが文字列型の場合、trim() メソッドで前後の空白を除去し、空文字でないか確認します。
空白だけの文字列セルをデータなしとみなすためのチェックです。- true
- データが含まれているとみなします。
- false
- 空白文字列としてデータなしとみなします。
- true
- セルのデータが文字列型の場合、trim() メソッドで前後の空白を除去し、空文字でないか確認します。
- return true;
- 数値やブール値など、非文字列型のセルはデータがあるとみなされるため「true」を返します。
この処理により、文字列以外のデータが見つかった場合もデータありと判定します。
- 数値やブール値など、非文字列型のセルはデータがあるとみなされるため「true」を返します。
- return columnIndex + 1;
- データが見つかった列インデックス「columnIndex」に「+1」を加え、Excel の列番号に合わせて返します。
Excel の列番号は「1」ベースのため、「0」ベースの「columnIndex」に「+1」しています。
- データが見つかった列インデックス「columnIndex」に「+1」を加え、Excel の列番号に合わせて返します。
- return 0;
- ループが終了してもデータが見つからない場合、シートが空であるとみなし「0」を返します。
データがないシートに対応するための処理です。
- ループが終了してもデータが見つからない場合、シートが空であるとみなし「0」を返します。
- }
- 関数「getLastDataColumn 」の終了を示しています。
総括・ポイント
このコード例では、シートの最終列から左に向かって各列を順に確認することで、データが存在する最終列を特定しています。
getUsedRange()
メソッドで取得される範囲には、書式設定や空白セルも含まれるため、getLastDataColumn()
関数を使用して実際にデータが入力されているセルのみを考慮しています。
最終列を取得する際に、データの列を逆から確認する理由
このコードがシートの最終列から確認を開始する理由は、最も右にあるデータを素早く見つけるためです。
左方向に確認すると、最終列が早い段階で見つかるため、残りの確認を省略でき、処理が効率化されます。
この記事のまとめ
この記事では、Officeスクリプトで最終行・最終列を正確に取得する方法について解説しました。
特に、getUsedRange()
メソッドを使った基本的な取得方法から、その限界を補うための関数を使った精密な取得方法まで幅広く紹介しました。
ポイントのおさらい
- 基本の取得方法
- getUsedRange() メソッドを使うことで、シート内で「使用されている範囲」を簡単に取得できます。
ただし、書式設定や空白セルが含まれている場合、意図しない範囲が含まれてしまうため注意が必要です。
⇒ 「OfficeスクリプトのgetUsedRange()メソッドの基本 | 最終行・最終列を求める」をもう一度見る
- getUsedRange() メソッドを使うことで、シート内で「使用されている範囲」を簡単に取得できます。
- getUsedRange() メソッドの限界と注意点
- getUsedRange() には空白セルや書式設定されたセルも「使用セル」として認識する限界があります。そのため、実際のデータ範囲と異なる範囲を取得してしまうことがあります。
空白セルや書式設定されたセルを認識したくない場合は、関数を作成して使用しましょう。
⇒ 「注意ポイント | getUsedRange()メソッドで取得できる最終行・最終列の限界」を見る
⇒ 「最終行を取得する関数:getLastDataRow()」を見る
⇒ 「最終列を取得する関数:getLastDataColumn()」を見る
- getUsedRange() には空白セルや書式設定されたセルも「使用セル」として認識する限界があります。そのため、実際のデータ範囲と異なる範囲を取得してしまうことがあります。
- 関数で正確に最終行・最終列を取得
- 空白セルや書式設定の影響を受けず、実際にデータが存在する範囲だけを正確に取得するためには関数化が便利です。
この方法により、データの最終行・最終列を簡単に特定できます。
⇒ 「OfficeスクリプトのgetUsedRange()メソッドで最終行・最終列を求める使用例」もう一度見る。
- 空白セルや書式設定の影響を受けず、実際にデータが存在する範囲だけを正確に取得するためには関数化が便利です。
さらに学ぶために
Officeスクリプトでデータ範囲を正確に取得することができるようになると、データ更新や自動化処理の精度が向上します。
今後は、さらに高度な自動化機能を組み合わせ、データ処理の効率化にチャレンジしてみましょう!