PowerAutomateでエクセルを扱う場合の注意

PowerAutomate便利ですね。
Office/Teamsとあわせてつかうとめちゃ便利です。
特にデータ保存やScriptなどでExcelOnlineと合わせて使うことが多いと思いますが
ExcelOnlineは結果整合性なので注意が必要。

例えば同一フロー内で「Excel→表に行を追加」「Excelスクリプトの実行」を順に行った場合、
前者の結果がが後者で参照できるかはタイミングによります。
Flow内でWaitしてみたり、エクセルを改めて開くようなことをしてみたのですが回避できませんでした。


なので、Excelスクリプトがあるときは行の追加や更新はエクセルスクリプトで一緒にやりましょう。
そうすれば1トランザクションの中なので、うまくいきます。

その他エクセルスクリプトをFlow内から呼び出すときの注意点
docs.microsoft.com

PowerAutomateフローで指定時間Waitする

自動化あるあるですが、PowerAutomateでもフロー内でWaitが必要になるときがあります。
ちょっと前まで「Delay Until」というWait用フローがあったのですがいつの間にか統廃合されていました。
なので、「Do Until」を使って指定秒数Waitしましょう。
f:id:GARAPON:20210830144642p:plain

変数初期化

現在時刻にWaitしたい分だけ加算しましょう。型は文字列型です。

addSeconds(utcNow(),5)

全部UTCのままでやっているのでデバッグのときとか気を付けましょう

Do Until

条件「utcnow()」,「次の値より大きい」、「上記で初期化した変数」
でセットしましょう。
アクションに何も設定していないと最適化でスキップされるので
無駄に足し算をさせるとか、テキストの検索を無駄に行うなどの人畜無害な処理を行わせましょう。
(指定時間Waitでなくてよいならここで1000カウントさせるとかでもよい)

これでOK。
ログでみるとちゃんとWaitされているのがわかりますね。

それでは良い自動化ライフを!

PowerAutomateで文字列編集をする

PowerAutomateで文字列編集するなら圧倒的にエクセルスクリプト
というかPowerAutomateは拡張スクリプトを書く場所がほかにないのでエクセルスクリプトに書くしかないともいえる。
まあスクリプトを一回呼び出せればあとは何でもできるわけです。
エクセルにデータも保存できるし、関数だって使いたい放題。

複数戻り値を戻す場合

というかんじでエクセルスクリプト依存が高まると、複数戻り値がほしくなるので
以下のように対処しましょう。

function main(workbook: ExcelScript.Workbook) {
  let nameArray = ["がらがらさん","ぽんぽんさん"];
  return nameArray
}

みたいなのを作ってからFlowで以下のデータの詰め替えをしてあげる。

    • 変数の初期化 データタイプArray
    • Apply to each 内で 配列変数に追加 

f:id:GARAPON:20210827182652p:plain

    • 関数で抜き出す variables('配列変素')[1] とかのファンクションとして文字列内に埋め込む

f:id:GARAPON:20210827183050p:plain

これで何とかなる。

ちょっとめんどくさいけど皆様の自動化生活に幸あれ!

PowerAutomateで日時スレッドに投稿する

PowerAutomate便利です。
Office関連と連携しながら色々できるのいいですよねー。

私はボットを作って各種情報をTeamsに呟かせているのですが、
普通にやると発言が多くなりすぎてみずらいので
日時でスレッドを作り、そこに呟かせるように修正してみました。

日時のスレッド作成

時刻トリガで日時の発言をさせます。
どうせなので以下のような関数で日付を記載しておきます。

formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'),'yyyy/MM/dd')

このあと自動的に返信を行うために上記発言のIDを保存しておきます。
PowerAutomateでストレージ代わりに使うとしたらやはりエクセルがおすすめです。
エクセルに日付、IDを格納する表を作っておき、そこに日付、IDを保存します。
このとき表の書式設定は文字列にしておきましょう。

随時発言を返信に修正。

発言フローの中でまず該当エクセルからIDを引っ張ります。そして
Teamsの「チャネル内のメッセージで返答」で該当IDに返答すればOK.

つい先日までFlowBotでは返答ができなかったのですが、いつの間にかできるようになりましたね。
日々機能改善されているPowerAutomateでこれからも楽しくやっていきましょう。

画面が操作可能なウインドウにいないときの対処

マルチディスプレイ環境で操作していると
たまにディスプレー外に表示され操作できなくなることがあります。

こんな時は
「Alt+Space」でコンテキストメニュを開いて「M」で移動を選択し矢印キーで右か左を押下して画面内まで移動させましょう。

f:id:GARAPON:20210419133458p:plain

これで快適。

VBAからWin32のSleepを呼び出す

vbaでスリープさせる方法はたくさんありますが、Win32APIのスリープを直呼びしてみたらいまいちだったけどメモ。

呼び出し方は以下の通り。

    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)

   Private Sub wait()
       Sleep 5000 
   End Sub

上記で使えはするが、SleepだとExcelなりOutlookなりVBAの母艦の反応も悪くなるので、VBAでつかうならdoEventのほうがCPUは食うけどお勧めな気がします。

なのでお蔵入りですね。

OutlookVBA フォルダ選択ダイアログの出しかた

outlookVBAでフォルダ選択ダイアログを出すには以下のように
PickFolderを呼び出しましょう。

Sub FolderPick()

    Dim objNS As NameSpace
    Dim objFolder As Folder

    Set objNS = Application.GetNamespace("MAPI")
    Set objFolder = objNS.PickFolder

    If TypeName(objFolder) <> "Nothing" Then
        Debug.Print " objFolder: " & objFolder
    Else
        Debug.Print "Cancel"
    End If

    Set objFolder = Nothing
    Set objNS = Nothing

End Sub

f:id:GARAPON:20210318170319p:plain
こんな感じでみえる。


OutlookVBAはほんと情報なくてめんどい。