SharePoint/OneDrive/Teamsのファイルをデスクトップアプリで開くためのショートカットの作り方


# 概要
+ SharePointOnlineのドキュメントライブラリやOneDriveに置かれたOfficeファイルを、デスクトップからデスクトップアプリで開く方法の覚え書きです。
+ SharePointの詳細設定でリンククリック時にデスクトップで開く設定はできるのですが、Web画面を一旦開く必要があり、デスクトップから直接開けると便利です。
+ Officeファイル限定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/8ff66692-266c-3148-f6b7-60a62388d2d7.png)

# 作成方法

## SharePointの場合
Excelファイルのショートカット作成を例にします。

1. SharePointのファイル→ファイル名右側の「︙」→詳細をクリック<br>
   ※又はファイルにチェックをつけて右上のⓘマーク<br>
2. 右のサイドバー→下の方の「パス」→クリップボードをクリックでファイルのパスをコピー
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/bf6f581d-9d1a-461f-a065-2de0cdc9feda.png)

3. Windowsのデスクトップ→新規作成→ショートカット
4. 「項目の場所」のテキストボックスに「ms-excel:先程コピーしたURL(https://～)」を貼り付ける
5. ショートカットの名前をつける
6. これで、作成されたショートカットをクリックするとデスクトップのExcelでSharePointのファイルが開きます。
7. 編集結果もちゃんと反映されています。
8. 前提条件として、デスクトップのOfficeも同じ365アカウントでログインしていないと認証できません。

'21/2追記
普通にms-excel:https://～で開くと読み取りモードとなり、編集をクリックして初めて編集可能になります。
※個人的にはこれが使いやすい。
開いたときに編集モードにしたい場合はms-excel:ofe|ofc|u|https://～とします。
※SharePointから開くときにアクセスしているURLと同じです。


## Teamsファイルの場合
Teamsのファイルも開けます。

1. Teamsのファイルタブ→右上の「SharePointで開く」をクリックする。
1. 後は上記のSharePointの手順でショートカットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7d0711c9-67e8-2e2f-c9ca-40a69b9997a7.png)
※Teamsでチームを作成すると裏側にSharePointサイトが作成され、TeamsのファイルはSharePointの機能で管理されます。

## ExcelやPowerPointから
ファイルのパスは、デスクトップアプリで開いておき、パスのコピーを使っても取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7ec8055a-5eee-a383-d0e8-ff76125f2ea6.png)


# アプリごとの開き方まとめ
|Office|モード|ショートカット|
|:----|:----|:----|
|Excel|読取モード| ```ms-excel:https://～``` |
|Excel|編集モード| ```ms-excel:ofe\|ofc\|u\|https://～ ```|
|Word|読取モード| ```ms-word:https://～ ```|
|Word|編集モード| ```ms-word:ofe\|ofc\|u\|https://～ ```|
|PowerPoint|読取モード| ```ms-powerpoint:https://～ ```|
|PowerPoint|編集モード| ```ms-powerpoint:ofe\|ofc\|u\|https://～ ```|

# URIスキーマ
ms-excel:の部分はWindowsのURIスキーマです。
WebからTeamsなどのデスクトップアプリを起動する際に使用されるものですね。
スキーマの一覧は下記から確認できます。
Wordファイルならms-word、パワポならms-powerpointとすると、それぞれのアプリで開けます。
https://docs.microsoft.com/ja-jp/office/client-developer/office-uri-schemes


頻繁に作成するのであればPowerShellで自動化してやると便利です。
自分の環境のURLでしか試してませんが一応コードを載せておきます。
 
```PowerShell:ショートカット作成ツール.ps1
Add-Type -AssemblyName System.Web
$ErrorActionPreference = 'stop' 

$url = Read-Host "SharePointURLを入力してください。"
$url -match "^https?://[a-z0-9\-]+?(-my\.sharepoint\.com|\.sharepoint\.com)\/" | Out-Null

if($Matches.Count -eq 0){
    Write-Host "SharePointまたはOneDriveのパスを貼り付けてください"
    return
}

[string]$prefix = switch($Matches.1){
    {$_ -eq '-my.sharepoint.com'}{
        'OneDrive'
        break
    }
    Default{
        'SPO'
    }
}
$Matches.Clear()

[string]$fileName = [System.Web.HttpUtility]::UrlDecode($url.Split('/')[-1])
[string]$fileExt = $fileName.Split(".")[-1]
[string]$uriSchema = switch($fileExt){
    {$_ -in 'xls','xlsx','xlsm'}{
        'ms-excel:'
        break
    }
    {$_ -in 'doc','docx','docm'}{
        'ms-word:'
        break
    }
    {$_ -in 'ppt','pptx','pptm'}{
        'ms-powerpoint:'
        break
    }
    Default{
        ''
    }
}

$shortcutName = "[$prefix]$fileName"

$shell = New-Object -ComObject WScript.Shell
$Shortcut = $shell.CreateShortcut("$home\Desktop\{0}.url" -f $shortcutName)
$Shortcut.TargetPath = "{0}{1}" -f $uriSchema, $url
$Shortcut.Save()

Write-Host "ショートカットを作成しました。＞$shortcutName"

```

# 補足
OneDriveやSharePointのフォルダは、デスクトップのOneDriveで同期するとエクスプローラで開け、ローカルファイルと同じようにショートカットを作成できます。
SharePointだとサイトごとに同期するのが面倒だったり、
企業によってはオフラインファイルが残らないよう、同期設定が禁止されているところもあると思います。
この方法であればショートカットを作ることができます。   

# おまけ
:::note warn
以下の内容は古いです。
Teamsのファイルは既定でデスクトップファイルで開く設定に変更できるようになりました。

:::
業務でTeamsを使用する機会が増えてきましたが、チームのタブ内のファイルをクリック時にデスクトップアプリで開く方法も載せておきます。
SharePoint側で「デスクトップで開く」を設定しても、Webでは反映されますがTeamsで開くとアプリ内で開かれてしまいます。
メニューからデスクトップで開くことはできますが数クリック必要であり面倒です。

方法は、「Teams→アプリの追加→Web→ドキュメントライブラリのURLを設定」です。
これでほぼSharePointと同様の動作になります。

SharePointの設定でデスクトップアプリで開く設定になっている必要があります。
Automateの実行ボタンはでてきませんね。
Listsもそうなのですが、TeamsからAutomateが実行できるようアップデートされませんかね・・