正攻法ではうまくできなさそうだった画像作成の自動化をUWSCを使って実現しました。
①がメインで②はおまけです。
【実現できたこと】
① GIMPでの画像作成の自動化
・入力値に合わせたテキストの変更
・入力値に合わせた表示レイヤーの選択
・入力値に合わせたファイル名をつけて保存
② Googleスプレッドシートでのグラフのダウンロード自動化
・入力値に合わせたファイル名をつけて保存
かなりニッチな内容ですが、1年に1人ぐらいは参考になる人がいるかと思って記事にしました。
わからない、わかりにくい、うまくいかない等ありましたらコメントください。
ビフォーアフター
① GIMP 投資成績に合わせて表示する天気画像を選び、日付を入れたファイル名で保存
② スプレッドシート 自動で更新されているグラフをダウンロードし、日付を入れたファイル名で保存
↓
ツールを実行し、天気画像と日付を入力する
作成する画像
以下の点を変更して作成しています。
・日付を更新
・右上の天気を投資成績に応じて変更
ファイル名は
「stock-jp-yymmdd_ec.png」です。
グラフの中身はGASの定期実行時に自動で更新されます。
ファイル名は
「stock-jp-yymmdd_gr.png」です。
UWSCとは
まづは今回使用したUWSCについて簡単に。UWSCはWindowsの操作を自動化するソフトウェアで、結構メジャーどころです。
マウスやキーボードの操作を記録して同じ動作を実行させたり、操作をスクリプトを書いて指示することもできます。
フリーウェアとシェアウェアがありますが、フリーウェアで十分です。(私もフリーウェで使っています。)
どうやら公式サイトが落ちているようですが、 Vector からダウンロードできるようです。
GIMPでの画像作成の自動化
GIMPの操作自動化は考えている人が多いみたいです。
機能拡張用スクリプト(Python-Fu)でPythonを用いて操作する方法が見つかりましたが、文字の置き換えは見つからなかったのでUWSCでの操作に切り替えました。
やることが整理できたので、Python-Fuでの同様の操作も実現できるかもしれません。
手順の洗い出し
まずは手順を洗い出します。
ひとつひとつの手順をスクリプトで書いていくため細かく作ったほうがよいです。
手順
- テンプレートファイルを開く
- レイヤーダイアログ選択(Ctrl + L)
- 最上位レイヤーを選択(HOME)
- Edit Text on canvas(Shift + Alt + T)
- 全選択(Cntl + A)
- 日付を変更
- 文字入力終了(Esc)
- 天気に応じてレイヤーを選択(Page Down)
- Toggle Layer Visibility(Shift + Alt + V)
- 画像をエクスポートして保存
10.1. 画像をエクスポート実行(Ctrl + E)
10.2. ファイル名を入力 ※保存場所のパス入りで
10.3. 保存(Enter x2) - Toggle Layer Visibility(Shift + Alt + V) ※次回のために初期値に戻す
- ファイルの変更を保存(Ctrl + S)
- GIMPを閉じる(Ctrl + Q)
下準備
テンプレ画像の調整
テンプレ画像を自動操作で扱いやすいように変更します。
GIMPのショートカットキー設定
手順の操作の中でデフォルトではないキーボードショートカットがあります。
「編集」 → 「キーボードショートカット」から以下のショートカットキーを設定します。
■Edit Text on canvas(選択しているテキストレイヤーの文字を編集)
Shift + Alt + T
■Toggle Layer Visibility(選択しているレイヤーの表示/非表示を切り替え)
Shift + Alt + V
スプレッドシートでのグラフのダウンロード自動化
GASを用いてGoogleドライブへ保存する方法を試しましたが、なぜか出力結果の画像の見た目が変わってしまうのでUWSCで手の操作を再現する方法を考えました。
手順の洗い出し
手順の洗い出しです。実際作成したフィードバックも盛り込んでいます。
- Edgeを開く
- ウィンドウ最大化(Windows + ↑)
- スプレッドシートを開く ※シートごとにURLが違う
- グラフをクリック
- グラフ右上の「…」をクリック
- Downloadをクリック ※マウスオーバー反応せず
- PNG imageをクリック
- 別名で保存
8.1. Saveの横の「^」をクリック ※ブラウザによって位置が違うかも
8.2. Save asをクリック
8.3. ファイル名を入力 ※保存場所のパス入りで
8.4. Enter - Edgeを閉じる(Alt + F4)
下準備
ブラウザ起動のショートカットキーを設定(Edgeの場合)
キーボードショートカットとして「Shift + Alt + E」を設定します。
ボタンの座標を調べる
UWSCの操作の記録を使って該当操作のスクリプトを作成。そのファイルを開き、クリックする座標を抽出します。
完成したスクリプト
////////PARAMETER////////
pass = "C:\Users\xxxxxxxx\" //画像を保存するフォルダのパスを入力 ※最後に\を入れる
year = 19 //年 ※年が変わったら要変更
template = "C:\Users\xxxxxxxx\日本株投資成績_自動化用.xcf" //ecテンプレートファイルのパス
/////////////////////////
//天気と月日をWMMDDの形式でユーザーが入力
paramater = INPUT("WMMDDの形式でパラメータを入力してください。(W:1=晴 2=晴曇 3=曇 4=雨 5=雷雨)", "WMMDD")
IFB VARTYPE(paramater) = VAR_EMPTY
MSGBOX("キャンセルされました")
ELSEIF VAL(paramater) = ERR_VALUE
MSGBOX("半角数字で入力してください")
ELSEIF LENGTH(paramater) <> 5
MSGBOX("5桁で入力してください")
ELSE
//weatherに値を入れる
weather = COPY(paramater, 1, 1) //COPYの引数は開始位置(1から)と文字数
IF weather < 1 OR weather > 5
MSGBOX("Wが無効な値です")
EXITEXIT
ENDIF
SELECT weather //確認画面用に文字化
CASE 1
weather_conf = "晴"
CASE 2
weather_conf = "晴曇"
CASE 3
weather_conf = "曇"
CASE 4
weather_conf = "雨"
CASE 5
weather_conf = "雷雨"
SELEND
//monthに月の値を入れる(1桁目が0なら2桁目のみ)
IF COPY(paramater, 2, 1) = 0
month = VAL(COPY(paramater, 3, 1)) //文字列ではうまく比較ができなかったので数値に変換
ELSE
month = VAL(COPY(paramater, 2, 2))
ENDIF
IF month < 1 OR month > 12
MSGBOX("MMが無効な値です")
EXITEXIT
ENDIF
//dayに日の値を入れる(1桁目が0なら2桁目のみ)
IF COPY(paramater, 4, 1) = 0
day = VAL(COPY(paramater, 5, 1))
ELSE
day = VAL(COPY(paramater, 4, 2))
ENDIF
IF day < 1 OR day > 31
MSGBOX("DDが無効な値です")
EXITEXIT
ENDIF
//入力した値を確認
confirm = MSGBOX("天気 = " + weather_conf + "<#CR>日付 = " + month +"月" + day + "日<#CR><#CR>でOKですか?",BTN_YES OR BTN_NO)
IF confirm = 8
MSGBOX("中止しました")
EXITEXIT
ENDIF
//////////////////////////////////////アイキャッチ画像作成//////////////////////////////////////
////1.テンプレファイルを開く////
//1.1.GIMPを起動
EXEC("C:\Program Files\GIMP 2\bin\gimp-2.10.exe")
SLEEP(7) //起動のために7秒待つ
//1.2.ファイルを開く(SCKEYはうまくいかなかった)
KBD(VK_CTRL, DOWN) //Ctrl+O
KBD(VK_O, CLICK, 100)
KBD(VK_CTRL, UP, 100)
SLEEP(0.5)
//1.3.日本株投資成績画像テンプレファイルを指定(うまくいかなかったので一旦クリップボードに入れてからペースト)
KBD(VK_RIGHT, CLICK, 100)
SENDSTR(0, template)
KBD(VK_CTRL, DOWN) //Ctrl+V
KBD(VK_V, CLICK, 100)
KBD(VK_CTRL, UP, 100)
KBD(VK_RETURN)
SLEEP(2) //スリープが必要
////2.レイヤーダイアログ選択(Ctrl + L)////
KBD(VK_CTRL, DOWN) //Ctrl+L
KBD(VK_L, CLICK, 100)
KBD(VK_CTRL, UP, 100)
////3.最上位レイヤーを選択(HOME)////
KBD(VK_HOME)
////4.Edit Text on canvas(Shift + Alt + T)////
KBD(VK_SHIFT, DOWN) //Shift + Alt + T: 設定したショートカットキー
KBD(VK_ALT, DOWN)
KBD(VK_T, CLICK, 100)
KBD(VK_ALT, CLICK, 100)
KBD(VK_SHIFT, UP, 100)
////5.全選択(Cntl + A)////
KBD(VK_CTRL, DOWN) //Ctrl+L
KBD(VK_A, CLICK, 100)
KBD(VK_CTRL, UP, 100)
////6.日付を変更////
SENDSTR(0, month + "月" + day + "日")
KBD(VK_CTRL, DOWN) //Ctrl+V
KBD(VK_V, CLICK, 100)
KBD(VK_CTRL, UP, 100)
////7.文字入力終了(Esc)////
KBD(VK_ESC)
////8.天気に応じてレイヤーを選択(Page Down)////
FOR A = 1 TO weather
KBD(VK_NEXT)
NEXT
////9.Toggle Layer Visibility(Shift + Alt + V)////
KBD(VK_SHIFT, DOWN) //Shift + Alt + V: 設定したショートカットキー
KBD(VK_ALT, DOWN)
KBD(VK_V, CLICK, 100)
KBD(VK_ALT, CLICK, 100)
KBD(VK_SHIFT, UP, 100)
////10.画像をエクスポートして保存////
//10.1.画像をエクスポート実行(Ctrl + E)
KBD(VK_CTRL, DOWN) //Ctrl+E
KBD(VK_E, CLICK, 100)
KBD(VK_CTRL, UP, 100)
SLEEP(1)
//10.2.ファイル名を入力 ※保存場所のパス入りで////
SENDSTR(0, pass + "stock-jp-" + year + COPY(paramater, 2, 4) + "_ec") //.pngは自動でつくので不要
KBD(VK_CTRL, DOWN) //Ctrl+V
KBD(VK_V, CLICK, 100)
KBD(VK_CTRL, UP, 100)
//10.3.保存(Enter x2)////
KBD(VK_RETURN)
SLEEP(1)
KBD(VK_RETURN)
SLEEP(1)
////11.Toggle Layer Visibility(Shift + Alt + V) ※次回のために初期値に戻す////
KBD(VK_SHIFT, DOWN) //Shift + Alt + V: 設定したショートカットキー
KBD(VK_ALT, DOWN)
KBD(VK_V, CLICK, 100)
KBD(VK_ALT, CLICK, 100)
KBD(VK_SHIFT, UP, 100)
////12.ファイルの変更を保存(Ctrl + S)////
KBD(VK_CTRL, DOWN) //Ctrl+S
KBD(VK_S, CLICK, 100)
KBD(VK_CTRL, UP, 100)
SLEEP(1)
////13.GIMPを閉じる(Ctrl + Q)////
KBD(VK_CTRL, DOWN) //Ctrl+Q
KBD(VK_Q, CLICK, 100)
KBD(VK_CTRL, UP, 100)
SLEEP(1)
//////////////////////////////////////スプレッドシートでのグラフのダウンロード自動化//////////////////////////////////////
////1.Edgeを開く(Shift + Alt + E) ※お好きなブラウザを起動////
KBD(VK_SHIFT, DOWN) //Shift + Alt + E: 設定したショートカットキー
KBD(VK_ALT, DOWN)
KBD(VK_E, CLICK, 100)
KBD(VK_ALT, CLICK, 100)
KBD(VK_SHIFT, UP, 100)
////2.ウィンドウ最大化(Windows + ↑)////
KBD(VK_WIN, DOWN) //Windows+↑
KBD(VK_UP, CLICK, 100)
KBD(VK_WIN, UP, 100)
SLEEP(1)
////3.スプレッドシートを開く////
//3.1.アドレスバーにカーソル移動(Ctrl + L)
KBD(VK_CTRL, DOWN) //Ctrl+L
KBD(VK_L, CLICK, 100)
KBD(VK_CTRL, UP, 100)
//3.2.URLを入力
SENDSTR(0, "https://docs.google.com/spreadsheets/d/xxxxxxxx") //グラフがあるスプレッドシートのURL
KBD(VK_CTRL, DOWN) //Ctrl+V
KBD(VK_V, CLICK, 100)
KBD(VK_CTRL, UP, 100)
//3.3.Enter
KBD(VK_RETURN)
SLEEP(15) //読み込みにかなり時間かかる 余裕を持って15秒に
////4.グラフをクリック////
BTN(LEFT,CLICK,1022,572,100) //座標は環境に依る
////5.グラフ右上の「...」をクリック////
BTN(LEFT,CLICK,1022,572,100) //座標は環境に依る
////6.Downloadをクリック ※マウスオーバー反応せず////
BTN(LEFT,CLICK,976,684,100) //座標は環境に依る
SLEEP(0.5)
////7.PNG imageをクリック////
BTN(LEFT,CLICK,1105,691,100) //座標は環境に依る
SLEEP(1)
////8.別名で保存////
//8.1.Saveの横の「^」をクリック
BTN(LEFT,CLICK,1244,1017,100) //座標は環境に依る
SLEEP(2)
//8.2.Save asをクリック////
BTN(LEFT,CLICK,1243,975,100) //座標は環境に依る
SLEEP(2)
//8.3.ファイル名を入力 ※保存場所のパス入りで////
SENDSTR(0, pass + "stock-jp-" + year + COPY(paramater, 2, 4) + "_gr.png") //.pngも必要
KBD(VK_CTRL, DOWN) //Ctrl+V
KBD(VK_V, CLICK, 100)
KBD(VK_CTRL, UP, 100)
//8.4.Enter
KBD(VK_RETURN)
SLEEP(2)
////9.Edgeを閉じる(Alt + F4)////
KBD(VK_ALT, DOWN) //Alt+F4
KBD(VK_F4, CLICK, 100)
KBD(VK_ALT, UP, 100)
ENDIF
※ハイライトの3行は伏字で加工しています。
補足情報:
GIMP ////1.テンプレファイルを開く////
テンプレ画像のファイルをEXECで叩いても開けなかったので、一旦GIMPを起動してからテンプレ画像のファイルを開くようにしました。
GIMP //1.2.ファイルを開く
「Ctrl + O」などの複数キー同時押しはSCKEYで実現できるはずですが、うまくいかなかったのでKBDで実現しています。(同時押し部分すべてです。)
GIMP //1.3.日本株投資成績画像テンプレファイルを指定
SENDSTRで直接入力欄に文字列を入力したかったのですが、うまくいかなったので一旦クリップボードに入れたのち、ペーストしています。(文字列入力部分すべてです。)
スプレッドシート ////6.Downloadをクリック
手動で行う場合はクリックではなく、マウスオーバーで展開されるのですがスクリプトではうまくいきませんでした。クリックにしたらうまくいきました。
実行結果
「51231」でパラメータを入力した実行結果です。グラフの画像は割愛しています。
あとがき
今までプログラミング関連で記事化してきた内容は他で似たような記事も探せますが、今回の内容は0から作り上げているのでできたときの喜びもひとしおでした。
需要自体は少なそうですが、お役にたてることがあれば嬉しいです。
ネットの調査開始~UWSCでのスクリプト完成まで延べ4時間強といった感じでしょうか。自動化によって得られる削減時間と作成時間のバランスは取れてませんね。
アイキャッチ画像もグラフ画像もいつまでこの形式でいくか分かりませんが、少しでも元が取れるように使っていきたいです。
自分の経験上、プログラミングでつまっているところを解決する方法はメモ書き程度の記事で見つかることもよくあります。なのでメモ書き程度で記事を書こうと思ってたのですが、結構しっかり書いてしまいました。。
コメント