【やりたいこと】
- 複数名で共有しているExce on the Web(以下、エクセル)のテーブルで、閲覧者が1クリックで自分のデータのみ表示できるようにしたい
氏名 | メールアドレス | 果物購入日 | 購入品名 |
---|---|---|---|
ホゲ太郎 | hogetarou@hogehoge | 2023/6/1 | りんご |
ホゲ花子 | hogehanako@hogehoge | 2023/6/2 | イチゴ |
ホゲ太郎 | hogetarou@hogehoge | 2023/6/4 | みかん |
ホゲ花子 | hogehanako@hogehoge | 2023/6/6 | ぶどう |
ホゲ花子さんがエクセルを開いてボタンをクリックしたら、ホゲ花子さんの行のみが表示されるのが理想
氏名 | メールアドレス | 果物購入日 | 購入品名 |
---|---|---|---|
ホゲ花子 | hogehanako@hogehoge | 2023/6/2 | イチゴ |
ホゲ花子 | hogehanako@hogehoge | 2023/6/6 | ぶどう |
【コード】
function main(workbook: ExcelScript.Workbook) {
// 作業用のシートを新規作成(後で消します)
const sheetName = "wk"
workbook.addWorksheet(sheetName);
const sheet = workbook.getWorksheet(sheetName);
// 作業用シートにコメントを追加してユーザーの情報を取得する
const cell = sheet.getRange("A1");
const comment = sheet.addComment(cell, "");
const name = comment.getAuthorName();
const email = comment.getAuthorEmail();
// 取得情報出力
console.log(name)
console.log(email)
// 作業用シートを削除
workbook.getWorksheet(sheetName).delete();
// ここからフィルター操作 ★対象のテーブル名を設定してください★
const tableName ="T果物購入履歴"
const dataTable = workbook.getTable(tableName);
// 事前にフィルターをクリアしておく
dataTable.getAutoFilter().clearCriteria();
// 指定の列に取得した情報でフィルターを設定 ★対象列名を設定してください★
const columnName ="メールアドレス"
dataTable.getColumnByName(columnName).getFilter().applyValuesFilter([email]);
}
あとはコード実行用ボタンをシートに配置して完了です!
【補足】
- 作業用のシートを作成している理由
既存シート上でコメント追加→削除をすると、既にコメントが入力されていた場合、そちらが消えてしまう懸念があったため
【諦めたこと】
(方法が分かれば実装したかった)
- 次の人が開いた時にフィルター設定がクリアされ、全データが表示されるようにしたい
(「フィルターをクリアする」ボタンを付けるくらいしか思いつかなかった) - むしろ開いた時点で自分のデータのみ表示するようにしたい
(VBAのWorkbook.Openイベント的な。PowerAutomateと連携すれば方法あるのかも?)
【使用シーン】
全社的なデータがあって、それを各担当者にチェックしてもらうといった時にユーザーが使いやすいはず
項目数が大量でメールアドレスや氏名の列が右端にあったりするテーブルだと、まず列を探してフィルターを設定して・・・というのが地味に負担だったりしません?
ユーザー側からすると、簡単に自分のデータのみ表示できるのは便利かな、と思いコードを書いてみました(コピペですが)。
【注意点】
- 作業用シートの名前は既存のシート名と重複しないようにしてください。同名シートが既に存在するとエラーが発生します。
- エクセルでコメントが入力された際に通知を受け取る設定にしている場合、コードが実行されるたびに通知が来ます。
- コード初回実行時、実行権限の確認ダイアログが表示されるかも。「許可」を選択すれば問題なく実行開始されます。
【参考にしたサイト】
ありがとうございました。