見出し画像

【Officeスクリプト】オートフィルターした結果を転記する

こんにちは。aliceです。
本当は60~80℃で緑茶を入れたいのにあまりの寒さに100℃の熱湯で入れてしまいます🍵
濃くてしぶーいお茶も好きです🍵


今日はOfficeスクリプトでオートフィルターをした結果を転記してみます。
このような感じです。

それではやっていきましょう。


オートフィルター

まずはオートフィルターを使ってみます。

こんな表があります。

この中から「さつまいも」をフィルターしてみます。

オートフィルターといえば自動記録ですね✨

さっそく自動記録してみましょう。

「操作を記録」をクリックします。
(今回はExcelオンラインを使っています)


記録中になりました。


記録しながらオートフィルターを使っています。


操作が終わったので停止します。
次のようなスクリプトが記録されました。

見にくいのでこちらをどうぞ。

function main(workbook: ExcelScript.Workbook) {
	let selectedSheet = workbook.getActiveWorksheet();
	// Toggle auto filter on selectedSheet
	selectedSheet.getAutoFilter().apply(selectedSheet.getRange("A1:C1"));
	// Apply values filter on selectedSheet
	selectedSheet.getAutoFilter().apply(selectedSheet.getAutoFilter().getRange(), 0, { filterOn: ExcelScript.FilterOn.values, values: ["さつまいも"] });
}


ちょっと修正しました🐻

function main(workbook: ExcelScript.Workbook) {
	const worksheet = workbook.getWorksheet("Sheet1");
	const range = worksheet.getUsedRange();
	const autoFilter = worksheet.getAutoFilter();

	autoFilter.apply(range, 0, {
		values: ["さつまいも"],
		filterOn: ExcelScript.FilterOn.values
	});

}


セルの取得まではいつもと同じです。
そのあとフィルターオブジェクトを取得します。

const autoFilter = worksheet.getAutoFilter();
console.logで出力してみました


そして、applyメソッドを使ってオートフィルターを実行します。
第1引数が範囲、第2引数がフィルターを適用する列のインデックス番号(この場合はA列なので0)、第3引数がフィルターの内容です。

autoFilter.apply(range, 0, {
	values: ["さつまいも"],
	filterOn: ExcelScript.FilterOn.values
});


filterOnの値はいろいろあるので、自動記録で確認するのが一番ラクです✨


オートフィルターした結果を転記する

オートフィルターを使えたので、次は転記をしていきましょう。

Sheet1に元データがあります。
Sheet2にオートフィルターした結果を転記します。
転記したらオートフィルターを解除します。


それでは実行します。


無事に実行できました。

コードはこちらです。

function main(workbook: ExcelScript.Workbook) {
    const worksheet1 = workbook.getWorksheet("Sheet1");
    const range = worksheet1.getUsedRange();
    const autoFilter = worksheet1.getAutoFilter();

    autoFilter.apply(range, 0, {
        values: ["さつまいも"],
        filterOn: ExcelScript.FilterOn.values
    });

    const values = range.getVisibleView().getValues();
    const worksheet2 = workbook.getWorksheet("Sheet2");
    worksheet2.getRangeByIndexes(0,0,values.length,values[0].length).setValues(values);

    autoFilter.clearCriteria();   
}


オートフィルターまでは先ほどと同じです。
getVisibleViewメソッドを使って表示されているセルの値を取得します。

const values = range.getVisibleView().getValues();


値の取得が終わったのでclearCriteriaメソッドでオートフィルターを解除します。

autoFilter.clearCriteria();


オートフィルターを使ったときはgetVisibleViewメソッドを使うと良い感じに転記できそうです。


filterメソッドを使って転記する

せっかくなのでオートフィルターを使わずにfilterメソッドを使ってみます。

function main(workbook: ExcelScript.Workbook) {
  const sheet1 = workbook.getWorksheet("Sheet1");
  const [headers, ...records] = sheet1.getUsedRange().getValues(); 

  const values = records.filter(record => record[0] === "さつまいも");
  values.unshift(headers);

  const Sheet2 = workbook.getWorksheet("Sheet2");
  Sheet2.getRangeByIndexes(0, 0, values.length, values[0].length).setValues(values);
}


いろいろなやり方がありますね。


おまけ(オートフィルターいろいろ)

せっかくなのでいろいろ遊んでみました。

複数の文字でフィルター

function main(workbook: ExcelScript.Workbook) {
	const worksheet = workbook.getWorksheet("Sheet1");
	const range = worksheet.getUsedRange();
	const autoFilter = worksheet.getAutoFilter();

	autoFilter.apply(range, 1, {
		values: ["あんのういも","きたあかり"],
		filterOn: ExcelScript.FilterOn.values
	});

}


valuesが配列なので複数の文字が入ります。


数値(○○以上)

function main(workbook: ExcelScript.Workbook) {
	const worksheet = workbook.getWorksheet("Sheet1");
	const range = worksheet.getUsedRange();
	const autoFilter = worksheet.getAutoFilter();

	autoFilter.apply(range, 2, {
		criterion1: ">=400",
		filterOn: ExcelScript.FilterOn.custom
	});

}

今回は400円以上でフィルターをかけてみました。
filterOnの値が文字列のときと違います。


複数条件

function main(workbook: ExcelScript.Workbook) {
	const worksheet = workbook.getWorksheet("Sheet1");
	const range = worksheet.getUsedRange();
	const autoFilter = worksheet.getAutoFilter();

	autoFilter.apply(range, 0, {
		values: ["さつまいも"],
		filterOn: ExcelScript.FilterOn.values
	});
	autoFilter.apply(range, 2, {
		criterion1: ">=400",
		filterOn: ExcelScript.FilterOn.custom
	});
}

組み合わせパターンです。

オートフィルター、奥が深いですね。


参考


🐻オートフィルター(ExcelScript.AutoFilter interface)


🐻フィルター条件(ExcelScript.FilterCriteria interface)


🐻FilterOn(ExcelScript.FilterOn enum)


🐻(getVisibleViewメソッド)


Officeスクリプト記事まとめ📝


『Officeスクリプト入門講座』を書きました📝


この記事が気に入ったらサポートをしてみませんか?