自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/VBA/GAS/JavaScript/Raspberry Piなどで色んなことを自動化

SharePoint Onlineの棚卸し。サイトごとのユーザー権限一覧を出力するPowerShellスクリプト

(この記事はClaude Sonnet 4により執筆しています)

はじめに

SharePoint Onlineを使っていると、気がつけばサイトが増えて権限管理が複雑になっていませんか?

「あのサイトには誰がアクセスできるんだっけ?」 「外部ユーザーに権限を与えすぎていないか確認したい」 「コンプライアンス監査のために権限一覧が必要」

そんな悩みを解決するために、SharePoint Onlineテナント内のすべてのサイト権限を一括で取得し、CSV形式で出力するPowerShellスクリプトを開発しました。

今回は、このツールの使い方と、開発中に遭遇したPnP.PowerShellモジュールのつまづきポイントとその解決策をご紹介します。

🎯 このツールでできること

主な機能

  • 全サイト権限監査: テナント内すべてのサイト(チームサイト、コミュニケーションサイト、OneDrive等)の権限設定を自動収集
  • 詳細情報取得: ユーザー名、ログイン名、メールアドレス、割り当てロールを包括的に取得
  • CSV出力: Excel等での分析に適したフォーマットで結果をエクスポート
  • 視覚的確認: Out-GridViewによる結果の即座確認

出力例

SiteUrl,Principal,LoginName,Email,Roles
https://contoso.sharepoint.com/sites/sales,田中太郎,i:0#.f|membership|tanaka@contoso.com,tanaka@contoso.com,編集
https://contoso.sharepoint.com/sites/sales,営業チーム,c:0o.c|federateddirectoryclaimprovider|abc123...,,"フル コントロール"
https://contoso.sharepoint.com/sites/hr,人事部グループ,c:0o.c|federateddirectoryclaimprovider|def456...,,編集

Out-GridViewでの結果表示画面

🚀 使い方

続きを読む

パスワード付きExcelのVBAを完全自動実行する方法(PowerShell/PowerAutomateDesktop/VBScript)

業務の効率化を目的に、Excel VBAでの自動化を行っている方は多いと思います。しかし、せっかくVBAマクロを作成しても、定期的に人間がボタンを押して実行しているのでは、自動化の意味が半減してしまいます。

そこで今回は、パスワード付きのExcelファイル内のVBAマクロをPowerShellとタスクスケジューラーを使って完全自動実行する方法をご紹介します。


1. 課題:VBAは作れても自動実行できない

Excel VBAは簡易な自動化手段として有効ですが、以下のような課題があります:

  • Excelファイルにパスワードが設定されている
  • マクロを手動で実行している
  • 定期実行の仕組みがなく人間が介在している

このような状況を打破するには、PowerShellWindowsタスクスケジューラーを活用した仕組み作りが有効です。


2. 解決策:PowerShell + タスクスケジューラー

以下のようなPowerShellスクリプトを用意します。

$excelFilePath = "C:\Path\To\Your\File.xlsm"
$password = "your_excel_password"

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open($excelFilePath, 0, $false, 5, $password)

# VBAマクロの実行("Module1.MacroName"など)
$excel.Run("YourMacroName")

$workbook.Close($false)
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

これを.ps1ファイルとして保存し、タスクスケジューラーで実行するように設定します。

タスクスケジューラーの設定手順

  1. 「タスクスケジューラー」を開く
  2. 「基本タスクの作成」を選択
  3. トリガーで実行タイミング(例:毎日9時)を設定
  4. 操作で「プログラムの開始」→ powershell.exe を指定
  5. 引数に -ExecutionPolicy Bypass -File "C:\Path\To\Script.ps1" を設定

3. 他の自動実行手段との比較と設定手順

Power Automate Desktop(無料RPAツール)を使う方法

長所:GUI操作も含めた自動化が可能、Microsoft公式、無料

短所:設定に慣れが必要、実行速度が遅めな場合も

設定手順

  1. Power Automate Desktopをインストール
  2. 新しいフローを作成
  3. 「Excelの起動」アクションを追加し、パスワード付きファイルを開く設定
  4. 「マクロの実行」アクションを使って、マクロ名を指定
  5. フローを保存し、Power Automateポータルでスケジュールフローを作成

VBScript(.vbs)で実行する方法

長所:古くからのWindows標準スクリプト

短所:今後のサポートが不透明、セキュリティ警告が出やすい

設定手順

  1. 以下のような.vbsファイルを作成:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objWorkbook = objExcel.Workbooks.Open("C:\Path\To\File.xlsm", , False, , "your_excel_password")
objExcel.Run "YourMacroName"
objWorkbook.Close False
objExcel.Quit
Set objWorkbook = Nothing
Set objExcel = Nothing
  1. タスクスケジューラーで wscript.exe を起動プログラムに指定し、引数で上記スクリプトパスを指定

注意:VBScriptは将来的にWindowsでのサポートが廃止される予定です。Microsoftの発表によると、2027年には完全にサポートが終了する予定です(2024年に非推奨化)。新しいプロジェクトには代替手段を検討することを推奨します。


4. 各手法の比較表

手法 長所 短所
PowerShell+タスク 標準機能のみで実装可、細かい制御も可能 初心者にはやや難解
Power Automate Desktop GUI操作も可能、ノーコードで直感的 設定に慣れが必要、動作が重くなる可能性
VBSスクリプト Windowsとの親和性が高い 2027年にサポート終了予定、使用は非推奨

まとめ

Excel VBAによる自動化は「実行」まで含めて初めて効果を発揮します。PowerShellとタスクスケジューラーを組み合わせれば、パスワード付きExcelファイルであっても定期実行が可能です。

今後は用途やセキュリティ要件に応じて、他の手段との使い分けも検討してみてください。

CSSで要素を横並びにしたい場合の選択肢 floatからの卒業:2025年版・モダンCSSレイアウト完全ガイド

2015年に公開した以下の記事:

codelife.cafe

では、当時主流だったfloatベースのレイアウトを、登場間もないFlexboxで置き換える方法を紹介しました。 あれから10年。CSSはさらに進化し、レイアウト手法の選択肢も広がりました。

この記事では、過去の方法を振り返りつつ、2025年現在におけるベストなCSSレイアウト手法を紹介します。


続きを読む

MacroDroidでYouTubeの広告を自動スキップするやつが動かなかったので日本語環境用に調整する

そこまで頑張るくらいならPremium契約しなよ...と言われても、どうにかマクロで広告を自動スキップしたい。むしろ自動スキップする仕組み作ること自体が楽しいのでしょうがない。

play.google.com

有志が配ってくれてるテンプレートのほとんどが英語版で日本語対応させる手間がちょっとあったり、日本語環境が特殊なのかテキストの判定が上手くできなくて修正に時間が掛かったのでシェアする。

※このマクロはW!lloO氏の「YouTube : Auto skip ads 🚫 V3」をベースとして多言語対応させています。

とりあえず.macroファイルくれさいの人は こちらからダウンロード してくれさい。

  • 機能概要
  • 問題:タップさせたい「スキップ」というテキストを読み取ってくれない
  • 対策:テキストではなくコンテンツIDで指定する
  • トリガー
  • アクション

機能概要

  1. YouTubeアプリ上で「広告主のサイトにアクセス」が表示されたら → 音量を0にして画面を暗くする
  2. YouTubeアプリ上で「スキップ」ボタンが表示されたら → スキップボタンをタップして、音量と画面の明るさを元に戻す
  3. YouTube上の「広告主のサイトにアクセス」が消えたら → 音量と画面の明るさを元に戻す
  4. YouTubeアプリを終了または画面をOFFにしたら → 音量と画面の明るさを元に戻す
続きを読む

はてなブログで書いたコードブロックにコピーボタンを追加する方法

このブログはプログラミングメモブログと題していて、便利だったからまた使うかもしれないコードスニペットを書くのがメインテーマだったりするのですが、何故か今まで実装していなかった「コードをコピーするボタン」。

ちょこっとJavaScript書けばできるだろうなと思いつつやってなかったのですが、ChatGPT先生にお願いして書いてもらったものが一発で動いたのでシェア。

右上のボタンをクリックでコピーされるやつ

設定方法

設定はわりと簡単で、以下のコードをはてなブログのデザイン設定→フッターに入れるだけ。

※モバイル側も別途設定が必要

コード

アイコンを全部絵文字でやってくれたので画像ファイルも用意しなくてOK。助かる。

コードブロック自体のシンタックスハイライトは過去記事を参考に設定ください。

codelife.cafe

<script>
document.querySelectorAll("pre").forEach((pre) => {
  // ボタン要素を作成
  const button = document.createElement("button");
  button.textContent = "📋 Copy";
  button.style.position = "absolute";
  button.style.top = "5px";
  button.style.right = "5px";
  button.style.padding = "5px 10px";
  button.style.fontSize = "12px";
  button.style.cursor = "pointer";
  button.style.border = "none";
  button.style.borderRadius = "5px";
  button.style.background = "rgba(0, 0, 0, 0.7)";
  button.style.color = "white";

  // `pre` の親要素を relative にする
  const wrapper = document.createElement("div");
  wrapper.style.position = "relative";
  pre.parentNode.insertBefore(wrapper, pre);
  wrapper.appendChild(pre);
  wrapper.appendChild(button);

  // コピー処理
  button.addEventListener("click", async () => {
    const codeLines = Array.from(pre.querySelectorAll("div"))
      .map((div) => div.textContent)
      .join("\n");

    try {
      await navigator.clipboard.writeText(codeLines);
      button.textContent = "✔ Copied!";
      setTimeout(() => (button.textContent = "📋 Copy"), 1500);
    } catch (err) {
      console.error("Copy failed", err);
      button.textContent = "❌ Error";
      setTimeout(() => (button.textContent = "📋 Copy"), 1500);
    }
  });
});
</script>