運営するネットショップで、200か所以上に発送する案件を頂いたので、受付作業を自動化してみた話。

運営しているネットショップにおいて、200か所越えの宛先に商品を発送する案件を頂きました。

配送先の情報については、すでにエクセルデータを頂いておりますが、商品の細かい仕様については現在打ち合わせ中で、明日の午前中に確定する予定です。

今回のように、たくさんの宛先に商品を発送する場合、配送先の入力作業が件数分だけ発生するわけですが、これが思いのほか大きな負担になったりするものです。

今回は以下のような準備を行いましたので、備忘録として記事に残しておきます。

安全のため、1件1件を手入力するのは避けたい

件数が少なければ、1件1件手作業でウェブサイトから手入力してもいいのですが、200件越えのデータをコピペミスなどの誤入力なく完璧に行うのはなかなか難しい作業です。

かといって、受注データを自社内の受注用データベースにスクリプトを書いて直接流し込んでしまうと、Google Analytics に記録が残りません。Google Analytics で売上を把握できた方が後々便利ですので、これは外せないところです。
(Google Analitics に受注データを飛ばす方法もありますが、新たな手間が発生してしまいます)

そこで、ブラウザを操作して受付を行うこととし、その作業については人間が行うのではなく、自動化することにしました。

Windowsを自動化する神ソフト「UWSC」を使う

作業の自動化は、「UWSC」というアプリケーションソフトを利用します。
比較的簡単なスクリプトを書くことで、Windowsの操作を自動化できるソフトです。
有償版と無料版がありますが、今回は無料版で事足ります。

これまでも様々なデイリーワークに活用して便利に使ってきましたが、今回はCSVファイルからデータを読み出して、そのデータの件数分だけ、ブラウザのボタンを押したり、文字を入力させたりして、注文作業を繰り返し実行するスクリプトを書いてみました。

UWSCの公式サイトで公開されているサンプルスクリプトやマニュアルを参考に、1時間ほどで組むことができましたよ。

スクリプトの細かな説明は省きますが、何かしらプログラミングの経験があれば、何となくやってることは分かるのではないでしょうか。

お客様からお預かりしたエクセルデータをCSV形式に書き出しておき、スクリプトと同じディレクトリに「order.csv」という名称で保存します。このCSVデータが読み込まれ、自動的に入力等の作業が行われる仕様になってます。

当然、私が管理するウェブサイトに合わせて書いたスクリプトですので、他のサイトで使う場合には、そのサイトの仕様に合わせて、「IESetDATA」や「IELink」を使い分けたり、パラメータを書き換えないと動きませんのでご注意を。

Public IE
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
setOleEvent()

fid = FOpen("order.csv", F_READ)
For i = 1 to FGET(fid, F_LINECOUNT)

	// 商品のページを表示する
	IE.Navigate("https://商品のURL")
	BusyWait()

	// カートへ入れるボタンを押す
	IESetData(IE, True, , "カートへ入れる")
	BusyWait()

	// レジに進むボタンを押す
	IELink(IE, "レジに進む")

	// 配送先などの文字データを書き込む
	IESetDATA(IE, "お客様のメールアドレス", "cust_o_email")
	IESetDATA(IE, FGet(fid, i, 1), "cust_o_name")
	IESetDATA(IE, FGet(fid, i, 2), "cust_s_zip")
	IESetDATA(IE, FGet(fid, i, 3), "cust_s_add1")
	IESetDATA(IE, FGet(fid, i, 4), "cust_s_name")
	IESetDATA(IE, FGet(fid, i, 5), "cust_s_tel")
	BusyWait()

	// 次のページへ進む
	IESetData(IE, True, , "次へ")
	BusyWait()

	// 支払方法でヤマトコレクトを選択する
	IELink(IE, "ヤマトコレクト(代金引換)")
	BusyWait()

	// 注文確定ボタンを押す
	IESetData(IE, True, , "購入")
	BusyWait()

Next
FClose(fid)


//------

DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32

CONST WM_ACTIVATE = $06
Public Pub_url, Pub_docc, Pub_BeforNav_cnt, Pub_DocComp_cnt, Pub_inp_flg

Procedure BusyWait()
	Sleep(0.3)
	tm = GetTime()
	repeat
		ifb GetTime() - tm > 90  // TimeOut
			Pub_docc = ""; Pub_BeforNav_cnt = 0; Pub_DocComp_cnt = 0
			IE.Navigate(Pub_url)
			tm = GetTime()
		endif
		Sleep(0.2)
		ifb Pub_inp_flg
			Pub_inp_flg = False
			continue
		endif
		if IE.busy then continue
		if Pub_url = "" then break  // No read
		if (Pos("*" + Pub_url + "*", Pub_docc)) or (Pos("*" + IE.LocationURL + "*", Pub_docc)) or (Pub_BeforNav_cnt <= Pub_DocComp_cnt) then else continue
		errflg = False
		if IE.document.title = "503 Unavailable" then errflg = True
		if IE.document.title = "Service Unavailable" then errflg = True
		if IE.document.title = "503 Service Temporarily Unavailable" then errflg = True
		ifb errflg
			Sleep(90)  // 503: Wait&Retry
			tm = 0
			continue
		endif
		Sleep(0.3)
	until ! Pub_inp_flg
	Pub_url = ""; Pub_docc = ""; Pub_BeforNav_cnt = 0; Pub_DocComp_cnt = 0
	SendMessageA(IE.Hwnd, WM_ACTIVATE, 0, 0)
Fend

Procedure setOleEvent()
  OleEvent(IE, "DWebBrowserEvents2", "BeforeNavigate2", "fucBeforNav")
  OleEvent(IE, "DWebBrowserEvents2", "DocumentComplete", "fucDocComp")
  OleEvent(IE, "DWebBrowserEvents2", "OnQuit", "fucQuit")
  Pub_url = ""; Pub_docc = ""; Pub_BeforNav_cnt = 0; Pub_DocComp_cnt = 0; Pub_inp_flg = False
Fend

Procedure fucBeforNav()
  ifb (Pos("javascript:", "" + EVENT_PRM[1]) = 0) and ("about:blank" <> "" + EVENT_PRM[1])
     if Pub_url = "" then Pub_url = "" + EVENT_PRM[1]
     Pub_BeforNav_cnt = Pub_BeforNav_cnt + 1
  endif
  Pub_inp_flg = True
Fend

Procedure fucDocComp()
  ifb (Pos("javascript:", "" + EVENT_PRM[1]) = 0) and ("about:blank" <> "" + EVENT_PRM[1])
     Pub_docc = Pub_docc + "*" + EVENT_PRM[1] + "*"
     Pub_DocComp_cnt = Pub_DocComp_cnt + 1
  endif
  Pub_inp_flg = True
Fend

Procedure fucQuit()
  ExitExit
Fend

明日注文の内容が確定次第、スクリプト内の商品URLを書き換えて実行すれば、あとはブラウザがわらわらと勝手に動き出して、200件越えの受付作業が自動的に行われるという寸法です。

作業時間の短縮とコピペミスの発生を防止できますので、こうした大量注文の際には、とても有効な方法だと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする