IT仕事

CliborのマクロをPythonの正規表現を使ってフォームに値をセットする

投稿日:

とにかくコピペ作業が多い職場なので、何かクリップボード拡張ソフトを入れたらいいねということで、Cliborを試してみたところ、なかなかよかったので、部署に啓蒙した。
「Clibor」定型文の挿入もできるテキスト専用のクリップボード履歴ソフト – 窓の杜ライブラリ
amuns:code

しらばくしてから、まてよ、導入の為に下調べした際にCliborにはマクロ機能があったなあと(マクロ機能 | amuns:code)。Pythonでごにょごにょできるなあと。それを使って以下のことができないだろうか。だんだん欲が出てきた。

・過去に注文のあったお客様から再度注文があった場合に、情報をコピペして、販売サイトの商品オーダーフォームに入力しているのだが、フォームのテキストボックスが15個もある。
・一つ一つのテキストボックスに15回コピペするのは結構大変である。
・そこで、一つ一つのテキストボックスにコピペするのではなくて、何か操作をしたら、その15個にドドドっと入力してほしい。

で、実際に作ってみたコードは、こちら。
最初はPythonのバージョンは作者のWebのサンプルと同じ2.7にしていたが、ある程度試した後で、今後のことも考えて3.6に変えた。なのでもしかするとpython2で必要だった日本語対応(uをつけるなど)は、もういらなくなったのかもですが。
また、コードはちょっと冗長と思うけども、、、すいません、わたしPython初心者なのでお許しを。

# -*- coding: utf-8 -*-
#<$C_CLB_PYTHON/>
import win32api
import win32com.client
import win32clipboard as CB
#
win32api.Sleep(100)
shell = win32com.client.Dispatch("WScript.Shell")
#
#正規表現のキーに、空白スペースあり・なしの場合があるので揃えておく
CB.OpenClipboard()
text1 = CB.GetClipboardData( CB.CF_UNICODETEXT ).replace(' :', ':')
CB.CloseClipboard()
#
#正規表現のキーをセット
import re
enckeyword1 = u'^(\s*お名前:)(.*)( )(.*)( 様)'
enckeyword2 = u'^(\s*フリガナ:)(.*)( )(.*)'
enckeyword3 = u'^(\s*会社・団体名:)(.*)'
enckeyword4 = u'^(\s*郵便番号:)(.*)'
enckeyword5 = u'^(\s*都道府県:)(.*)'
enckeyword6 = u'^(\s*ご住所:)(.* )(.*)'
enckeyword7 = u'^(\s*ビル名等:)(.*)'
enckeyword8 = u'^(\s*電話番号:)(.*)'
enckeyword9 = u'^(\s*メールアドレス:)(.*)'
enckeyworda = u'^(\s*領収書:)(.*)'
#
#リストを初期化し、検索し、見つかれば検索結果のスペースを削除してセット
str_list = [0 for i in range(15)]
match1 = re.search( enckeyword1 ,text1, flags=re.MULTILINE)
str_list[1] = ' ' if match1 is None else match1.group(2).strip()
match2 = re.search( enckeyword1 ,text1, flags=re.MULTILINE)
str_list[2] = ' ' if match2 is None else match2.group(4).strip()
match3 = re.search( enckeyword2 ,text1, flags=re.MULTILINE)
str_list[3] = ' ' if match3 is None else match3.group(2).strip()
match4 = re.search( enckeyword2 ,text1, flags=re.MULTILINE)
str_list[4] = ' ' if match4 is None else match4.group(4).strip()
match5 = re.search( enckeyword3 ,text1, flags=re.MULTILINE)
str_list[5] = ' ' if match5 is None else match5.group(2).strip()
match6 = re.search( enckeyword4 ,text1, flags=re.MULTILINE)
str_list[8] = ' ' if match6 is None else match6.group(2).strip()
match7 = re.search( enckeyword5 ,text1, flags=re.MULTILINE)
str_list[9] = ' ' if match7 is None else match7.group(2).strip()
match8 = re.search( enckeyword6 ,text1, flags=re.MULTILINE)
str_list[10] = ' ' if match8 is None else match8.group(2).strip()
match9 = re.search( enckeyword6 ,text1, flags=re.MULTILINE)
str_list[11] = ' ' if match9 is None else match9.group(3).strip()
matcha = re.search( enckeyword7 ,text1, flags=re.MULTILINE)
str_list[12] = ' ' if matcha is None else matcha.group(2).strip()
matchb = re.search( enckeyword8 ,text1, flags=re.MULTILINE)
str_list[7] = ' ' if matchb is None else matchb.group(2).strip()
matchc = re.search( enckeyword9 ,text1, flags=re.MULTILINE)
str_list[6] = ' ' if matchc is None else matchc.group(2).strip()
matchd = re.search( enckeyworda ,text1, flags=re.MULTILINE)
str_list[13] = ' ' if matchd is None else matchd.group(2).strip()
#
#デバッグ用
#text = ','.join([item for item in str_list if item])
#
#リスト項目を当該箇所にペーストし、タブで次のテキストボックスに移り、またペースト・・・を繰り返す
win32api.Sleep(100)
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[1], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[2], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[3], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[4], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[5], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[6], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[7], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[8], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[9], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[10], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[11], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[12], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#
win32api.Sleep(100)
#
shell.SendKeys("{TAB}")
win32api.Sleep(100)
#
CB.OpenClipboard()
CB.EmptyClipboard()
CB.SetClipboardText( str_list[13], CB.CF_UNICODETEXT )
CB.CloseClipboard()
#
shell.SendKeys("^v")
#

例えば、以下のようなメール文書の一部(架空の注文のサンプルです。不要な行は削除されるので前後を含んでもOK)をコピーして、

お名前 : 近藤 武志 様
フリガナ : コンドウ タケシ
会社・団体名 :
郵便番号 :  3510104
都道府県 :  埼玉県
ご住所 : 和光市南 143-1
ビル名等 :
電話番号 : 0123456789
メールアドレス : test@yahoo.co.jp
領収書 : (有)やふーではないどこかのかいしゃ

Cliborの定型文に登録したマクロを実行すると・・・

ドドドっと、入ってくれる。

おお、うまくいってよかった。
もし、このままいくらかテストしてみて問題ないようなら、部署の全スタッフのPCにPython入れなきゃ。

-IT仕事

執筆者:

関連記事

秀丸の正規表現で置換

秀丸で文字の前後を入れ替えたい

秀丸で、文字の前後を入れ替え(置き換え)たいとしたときに、結構手間取ったので、メモ。 やりたいこと。 例えば、 「Tシャツ《無地》5枚 カラー:グリーン サイズ:フリー 」を 「Tシャツ《無地》5枚 …

Jazzy Formsで見積を計算してもらいその結果をメールで送る方法

やりたいことは、 「Webサイトの見積フォームを設置し、それを使ってお客さんに見積をしてもらい、その見積結果を管理者宛に送信する」 ・・・というもの。 WordPressのプラグインで、「Jazzy …

Googleドキュメントの共有したスプレッドシートが表示できない

困った現象: ・ウェブに一般公開設定したスプレッドシートが、ログアウトした状態で、共有できない。 ・共有設定をしているにもかかわらず、共有リンクを開こうしようとするとログイン画面に転送される。 ・スプ …

no image

中国製品は・・・

会社で印刷用の大型ロール紙を某国から直接仕入れているのですが、今回分に、数メートルおきに小さな穴が開いている品が混じっていたそう。。。ひどい。担当者が「今度は、そうきたか・・・」ってため息ついてました …

no image

Xojoに興味がある

というのも、Webアプリが作りたくなったからである。 https://xojo.grapecity.com/ HTML5が世に出てから数年したくらいに、Monacaの入門本を買って、それで試しにWeb …