[Power Automate] Kintoneから安全にファイルをダウンロードする方法

Robinコード

**REGION 定数定義
SET TARGET_URL TO $'''https://★★★/k/2/exportRecord?view=20#q&sort_0=f5118284&order_0=ASC'''
SET DOWNLOAD_FOLDER TO $'''C:\\works\\PAD\\kintone\\app01\\download'''
SET BACKUP_FOLDER TO $'''C:\\works\\PAD\\kintone\\app01\\history'''
**ENDREGION
**REGION 前提条件
Folder.GetFiles Folder: DOWNLOAD_FOLDER FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
IF Files.Count > 0 THEN
    EXIT Code: 0 ErrorMessage: $'''このフローを実行するときは、ディレクトリ「%BACKUP_FOLDER%」の中身が空である必要があります。'''
    Display.ShowMessageDialog.ShowMessage Title: $'''前提条件エラー''' Message: $'''このフローを実行するときは、ディレクトリ「%BACKUP_FOLDER%」の中身が空である必要があります。''' Icon: Display.Icon.ErrorIcon Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False
END
**ENDREGION
**REGION Kintoneから全件CSVをダウンロード
WebAutomation.LaunchChrome.LaunchChrome Url: TARGET_URL WindowState: WebAutomation.BrowserWindowState.Maximized ClearCache: False ClearCookies: False WaitForPageToLoadTimeout: 10 Timeout: 10 BrowserInstance=> Browser
# 書き出すボタンをクリック
WebAutomation.ExecuteJavascript BrowserInstance: Browser Javascript: $'''function ExecuteScript() { 
	const button = document.querySelector(\'#export-submit-gaia\');
	button.click();
}'''
WAIT 3
/# ダウンロードリンクをクリック
ダウンロードするファイル名を返却#/
LOOP LoopIndexJ FROM 1 TO 10 STEP 1
    WebAutomation.ExecuteJavascript BrowserInstance: Browser Javascript: $'''function ExecuteScript() { 
	// tableの要素を取得
    	const table = document.querySelector(\'#downloadlist-table-wrapper-gaia\');
       
    	// table全行を取得
    	const table_rows = document.querySelectorAll(\'.gaia-downloadList-list-table-row\');
       const first_row = table_rows[0];
       const text = first_row.innerText;
       const download_links = first_row.querySelectorAll(\'.gaia-downloadList-list-table-row-download-button\');

       // Kintone側でダウンロードの準備ができていない場合、待機
    	if (text.includes(\'待機中\')) {
    		return \"\";
    	} else if (download_links.length == 0) {
    		return \"\";
    	} else {
	    	// リンクの一番上をクリック
    		download_links[0].click();
    		return download_links[0].innerText;
    	}
}''' Result=> Result
    SET downloadFileName TO Result
    IF downloadFileName <> $'''%''%''' THEN
        EXIT LOOP
    END
    WAIT 1
END
IF downloadFileName = $'''%''%''' THEN
    EXIT Code: 0 ErrorMessage: $'''ダウンロードに失敗しました。'''
END
/# ウィンドウ内のテキスト入力
%DOWNLOAD_FOLDER%\\%downloadFileName%#/
/# ウィンドウのUI要素をクリック
保存ボタン#/
WAIT (File.WaitForFile.Created File: $'''%DOWNLOAD_FOLDER%\\%downloadFileName%''') FOR 10
WebAutomation.CloseWebBrowser BrowserInstance: Browser
**ENDREGION
**REGION ダウンロードファイルの移動
File.Move Files: $'''%DOWNLOAD_FOLDER%\\%downloadFileName%''' Destination: BACKUP_FOLDER IfFileExists: File.IfExists.DoNothing
**ENDREGION

 

 

フロー定義

 

1分解説

7 ~ 10行目:ダウンロードフォルダの格納場所が空であることを確認している。正直いらない処理ではあるが、例えば前回の実行結果の名残のファイルが残っているなどがあると、ややこしいことになるので、お守り程度の間隔でチェックを入れている。

19 ~ 29行目:本記事のメインテーマ。
Kintoneでは「書き出し」ボタンをクリックすると、画面が切り替わり「待機中」というステータスになる。
「待機中」から「完了」になるまで待たなければ、ひとつ古い2段目のファイルをダウンロードしてしまう可能性がある。

また、「待機中」の間、URLのリンクも表示されないため、URLが表示されるまで待機しなければいけない。
PADでテーブルの1番目の要素のURLを、というテーブルの順序を認識できるのかが分からなかったので、楽にjavascriptで監視をすることにした。

ここで1点面倒なのが、PADのjavascriptは非同期処理が入れられない。
awaitを入れても待機してくれないし、SetIntervalを書こうにも、関数を2つ定義できないっぽい。(エラーにはならないが、呼び出されない)
そのため、待機処理はPAD側で、要素が取得できるかはjsで判定している。

30、31行目:UI要素の操作になり、キャプチャのせいでROBINコードが膨大になってしまうため、ROBINコードの掲載は30,31はコメント行に差し替えている。

32、33行目:地味だが、非常に大切。必ずファイルのダウンロードが完了してからWebブラウザを閉じること。

動作確認

100回反復動作して、全件正常終了を確認済み。