2018年12月

PowershellからExcel出力

Excelファイルを作成する

ここが詳しい

ここも詳しい

以下楽天ブックスのWeb APIを用いて書籍検索の結果をExcelに保存する例

#WebAPIで書籍情報を取得
$body = @{
    title="PowerShell"
    applicationId="****"
}

#xml形式で格納
$response = Invoke-RestMethod -Uri https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?format=xml -Method Post -body $body

#ここからExcelにセット
try {
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $true

    #新しいExcelBookを追加
    $book = $excel.Workbooks.Add()

    #作業するシートを選択
    $sheet = $book.Sheets($book.ActiveSheet.Name)
    $rows =1

    $sheet.Cells.Item($rows,1)="タイトル"
    $sheet.Cells.Item($rows,2)="出版社"
    $sheet.Cells.Item($rows,3)="価格"

    #桁区切りの書式に変更
    $sheet.Range("C:C").Columns.NumberFormatLocal =  "#,##0_ "

    #xmlから必要な項目を抜き出しセルにセット
    foreach ($item in $response.root.Items.Item) {
        $rows ++
        $sheet.Cells.Item($rows,1)=$item.title
        $sheet.Cells.Item($rows,2)=$item.publisherName
        $sheet.Cells.Item($rows,3)=$item.itemPrice
    }

    # 列幅の調整
    $range = $sheet.Range("A:C")
    $range.EntireColumn.AutoFit() | out-null
    $book.SaveAs("C:\work\books.xlsx") #保存

    } finally{
        $excel.Quit()  # Excel の終了
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) # 変数の破棄
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) # 変数の破棄
    }

セルのフォントや書式は適当な変数にオブジェクトを作ってやってコード補完機能からそれらしい 項目を探すか、Excelのマクロの記録で探す。(又は上のリンクを参照する) だいたい$sheet.cells.itemか$sheet.Rangeで探せるはず。

$t=$sheet.cells.item(1,1)
$t.Font.Size=11

$excel.Visible = $falseをTrueにするとExccelを表示しながら処理が実行される。

$excel.DisplayAlerts = $falseにすると保存をせずにExcelを閉じた場合等の確認メッセージを表示させなく出来る。

$book.SaveAs上書き保存は$Book.Save

CSVファイルに出力した方が使い勝手はいいかもしれない

$response.root.Items.item | Select-Object title,publisherName,itemPrice | Export-Csv -Path C:\work\book.csv -Encoding Default -NoTypeInformation #カンマ区切り

$response.root.Items.item | Select-Object title,publisherName,itemPrice | Export-Csv -Path C:\work\book.csv -Encoding Default  -Delimiter `t -NoTypeInformation #タブ区切り

漫才のネタ中に観覧者や共演者のカットが入るようになったのはいつからか

漫才やコントのネタ途中に審査員等、第三者のアップが抜かれるのがどうにも気になる。
いつ頃からこの演出手法が定着したのか調べてみる。

以下AmazonPrimeVideoのM1グランプリで審査員や客席のカットが入った回数

優勝コンビの1回目のネタで確認

2001年(中川家)

  • 0回

2002年(ますだおかだ)

  • 10回

2003年(フットボールアワー)

  • 3回

2004年(アンタッチャブル)

  • 8回

2005年(ブラックマヨネーズ)

  • 10回

2006年(チュートリアル)

  • 9回

2007年(サンドウィッチマン)

  • 5回

2008年(NON STYLE)

  • 5回

2009年(パンクブーブー)

  • 7回

2010年(笑い飯)

  • 2回

2015年(トレンディエンジェル)

  • 8回

2016年(銀シャリ)

  • 4回 (1回目のネタ全カットのため2回目のネタで確認)

2017年(とろサーモン)

  • 5回

2001年の中川家は0回だったが他のコンビでは頻繁に審査員のカットが割り込んでいた。
お笑いスター誕生の頃には既にネタ中に審査員のリアクションが抜かれていたようなので、"いつから"という疑問に対しては"昔から"という結論になってしまった。

観覧者を入れないネタ専門番組や笑点位しかテレビでネタを集中してみる方法はないようだ。

.ps1ファイルを管理者権限で実行する

実行に管理者権限が必要な.ps1ファイルを実行する方法
※右クリック→Powershellで実行ではエラーになってしまう。

実行ポリシーを変更する

Powershellを管理者権限で実行後
Set-ExecutionPolicy 引数

#現在の実行ポリシーを確認
Get-ExecutionPolicy

#実行ポリシーを変更
Set-ExecutionPolicy RemoteSigned

スクリプトファイルを作成する

実行したい処理を記述したファイルと管理者権限でPowershellを起動してファイルを実行するスクリプトファイルを作成する。

以下実行例

実行したい処理(既存タスクのスケジュール変更)
Task_Edit.ps1

$trigger = New-ScheduledTaskTrigger -Once -At "2018/12/12 04:30:00"
Set-ScheduledTask -TaskPath "\" -TaskName "変更したいタスク名" -Trigger $trigger

管理者権限でPowershellを起動してTask_Edit.ps1を実行するスクリプトファイル
start_process.ps1

Start-Process powershell -ArgumentList (Convert-Path .\Task_Edit.ps1) -Verb runas

後はTask_Edit.ps1とstart_process.ps1を同一ディレクトリに配置してstart_process.ps1を右クリック→Powershellで実行を選択する。

実行ポリシーを変更したくない場合

スクリプト実行時のみポリシーを変更する

start_process.ps1

$file=(Convert-Path .\Task_Edit.ps1)
Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy unrestricted $file" -Verb runas

Invoke-RestMethodの文字化け

Invoke-RestMethodからWeb API利用時、サイトによって取得結果が文字化けする場合の対処。

Invoke-WebRequestを使用する

こちらを参考に


$body = @{必要なパラメータを連想配列で}
$response = Invoke-WebRequest -Uri "https://..." -Body $body

#以下を実行してcontent-typeの値を確認
$response.Headers

#一旦Byte配列で取り出して、UTF-8でエンコード(content-typeの値で文字コードは決める)
$data = [System.Text.Encoding]::Utf8.GetString($response.RawContentStream.GetBuffer())

#xmlで取得していれば
$data = [xml]$data

これでもうまくいかないときがある。 ヤフーデベロッパーのキーフレーズ抽出は中途半端に成功する。

WebClientを使う

#ヤフーデベロッパーのキーフレーズ抽出
$client = New-Object System.Net.WebClient
$client.Encoding = [System.Text.Encoding]::UTF8
$content = $client.DownloadString("https://jlp.yahooapis.jp/KeyphraseService/V1/extract?appid=アプリID&sentence=東京ミッドタウンから国立新美術館まで歩いて5分で着きます。")
$data = [xml]$content
$data.ResultSet.Result | Format-List

PS C:> $data.ResultSet.Result | Format-List

Keyphrase : 国立新美術館
Score     : 100

Keyphrase : 東京ミッドタウン
Score     : 69

Keyphrase : 5分
Score     : 10

PowershellでWeb APIを使う

Invoke-RestMethodを使用する

準備

アプリケーションIDを取得が必要なサービスの場合、事前に取得しておく

httpsを使用した接続の場合

Invoke-RestMethod : 接続が切断されました: 送信時に、予期しないエラーが発生しました。

とエラーになる場合がある。(YAHOOのAPIはエラーになった)

TLS1.2が有効になっていないことが原因なので以下コマンドで有効にしておく

こちらのサイトを参照

#設定されているTSLを確認する
[Net.ServicePointManager]::SecurityProtocol
#TLS1.2を有効にする
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

使用方法

リクエストURLとパラメータを指定する。

#パラーメータは連想配列
$body @{
    para1 = "パラメータ"
    para2 = "パラメータ"
}

Invoke-RestMethod -Uri <リクエストURL> -Method Post -body $body

使用例

政府統計の総合窓口(e-Stat)から登記統計の統計表情報を取得


$uri = "https://api.e-stat.go.jp/rest/2.1/app/getStatsList?"
$body=@{
appId="登録してIDを取得"
statsCode = "00250002"
limit="100"
}

$response = Invoke-RestMethod  -Uri $uri -Body $body -Method Get

#出力例
$response.GET_STATS_LIST.DATALIST_INF.TABLE_INF | Format-Table  id,STATISTICS_NAME,TITLE

id         STATISTICS_NAME TITLE                                               
--         --------------- -----                                               
0003206184 登記統計 総括・不動産・その他 登記総括(年計表) 法務局及び地方法務局管内別 登記事務取扱件数及び個数                
0003206193 登記統計 総括・不動産・その他 不動産登記(年計表) 法務局及び地方法務局管内別 筆界特定事件の受理,既済及び未済件数         
0003206204 登記統計 総括・不動産・その他 その他の登記(年計表) 法務局及び地方法務局管内別・種類別 夫婦財産契約の登記の件数          
・
・
・

$response.GET_STATS_LIST.DATALIST_INF.TABLE_INF | Format-list  id,STATISTICS_NAME,TITLE

id              : 0003206184
STATISTICS_NAME : 登記統計 総括・不動産・その他
TITLE           : 登記総括(年計表) 法務局及び地方法務局管内別 登記事務取扱件数及び個数

id              : 0003206193
STATISTICS_NAME : 登記統計 総括・不動産・その他
TITLE           : 不動産登記(年計表) 法務局及び地方法務局管内別 筆界特定事件の受理,既済及び未済件数

id              : 0003206204
STATISTICS_NAME : 登記統計 総括・不動産・その他
TITLE           : その他の登記(年計表) 法務局及び地方法務局管内別・種類別 夫婦財産契約の登記の件数
・
・
・