チュートリアル2-2

2022年12月9日

概要

前回作成したシナリオは検索ワードがAでしたが、AーZまで対応します。
なお、I,J,N,O,U,Vは欠番なので、エラー画面のメッセージを取得します。

Excelシート

シートの1枚目にA~Zまで記入します。検索にヒットした場合は、別シートに検索結果を出力します。エラー時は、検索ワードの横にエラーメッセージを出力します。

Excelのイメージ
AB
1A
2B
3C
 
9Iエラー内容
10Jエラー内容
 
25Y
26Z
入出力シート(イメージ)

シナリオ改良

入力シートの指定

Excelタブで先ほどのシートを入力シートに指定します。

入力シート設定

検索ワードの取得

ExcelのA列に値がある間、検索処理を繰り返します。繰り返しの回数(アルファベット26文字)が分かっているので、FOR-NEXTを使用します。
前回のシナリオの先頭部分を変更します。

CtrlIOTYPE入力オプション
FORカウンター:^i、開始値:1、終了値:26、STEP:1
IN検索画面のURLをセット
INTEXT入力前クリアA^i
INボタンクリック
NEXT
  • FOR文を宣言し、Excel入力シートの行を変数「^i」で管理します。「^i」の取る値は1~26です。
  • 検索テキストボックスの入力値を、固定値「A2」から、セルの値「A列の^i行」に変更します。

なお、チュートリアル1では、検索画面の再表示は、ブラウザの戻る機能で実施しました。今回は、結果画面が複数ページに渡り、1回Backしただけでは、検索画面まで戻れないので、毎回URLをセットするようにします。

エラーMSG出力

エラーメッセージの出力セルが「A2」となっているので、B列に変更します。

CtrlIOTYPEXPath
ELSE
INNUM:SUBSTITUTE//div[@class="message_"]B^i
END-IF

変数「^i」はExcel入力シートの行を保持しています。

出力シート名のセット

出力シート名が「JIN_A」と固定値となっています。変数を利用するようにします。

IOTYPE変数入力オプション内容
IN
STR:
SUBSTITUTE
変数名:^str1、
セルで指定
A^i入力値保存
OUTTABLE[シート名:^str1]出力先:新規シート、
シート名:JIS_^str1
A1ヘッダ出力
OUTTABLE[シート名:^str1]出力先:新規シート、
シート名:JIS_^str1
A^row表の出力

改良シナリオ

改良シナリオ

シナリオ実行

完成したシナリオを実行します。

シナリオ実行

先頭のFORでカウンター「^i(入力シートの行数)」が加算され、2回目の検索テキストボックスには「B」が入力されています。

問題

「W」は本来は10件なのですが、20件出力されています。

Excel出力結果

同じ内容が重複して出力されています。最終ページの判定は、「次へ」ボタンをクリックした時に、ブラウザのURLが変更されるかどうかで判定していました。

原因の調査

検索画面に「W」を手動で入力し、結果画面を表示します。

初回の結果画面

「次へ」ボタンをクリックします。

「次へ」ボタン押下後

表示される内容は同じですが、URLが変わっています。

初期表示:https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?show

2回目:https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?research&pageNo=1

なお、「A」など、2ページ目以降があるばあいは、「次へ」ボタンを押した後のURLは
「https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?research&pageNo=2」と「pageNo」が「2,3,4,5…」と順番に増えていきます。

対応策

「次へ」ボタンをクリックすると、URLの最後は

  • 結果が1ページだけの場合は:常に「pageNo=1」
  • 2ページ以上の場合:「pageNo=2,3,4….」

となります。

ですから、「次へ」ボタンをクリックして、URLの最後が「pageNo=1」であれば、最終ページと判断できます。

シナリオ修正

上記の内容を反映します。ついでに、正常時には入力値の隣に件数を出力するようにします。

ループ条件の追加

URLの最後が「pageNo=1」であれば、「BREAK」でWHILE文を終了する処理を入れます。
BREAKする条件は、変数「^URL」の右から8文字が「pageNo=1」の場合です。

CtrlIOTYPE入力オプション
INSTR:LAST-VALUE変数名:^URL
INSTR:RIGHT^page=RIGHT(^URL, 8)
IFVAR-STR条件:文言一致、変数名:^page、文言:pageNo=1
BREAK
END-IF
ループのBREAK処理
  • URLを保持している変数「^URL」から、「RIGHT」で後ろから8文字を切り出し、変数「^page」に代入します。
  • IF文で、「^page」の値が「pageNo=1」であれば、「BREAK」でループから脱出します。

件数出力

結果画面が表示されたタイミングで、画面右下の「xxx件中xx~xx件を表示」を取得し、先頭の数字部分を出力します。

IOTYPE変数XPath入力オプションFixed/
列:行
OUTLABEL//div[@class="page-navi"]//pTrue
INSTR:
LAST-VALUE
変数名:^cnt
OUTSTR:INSTR文字(元):^cnt、
数値(新):^len、
文言:件中
INSTR:LEFT[文字数:^len]^cnt=LEFT(^cnt, ^len-1)
OUTSTR:OUTPUT変数名:^cntB:^i
件数の取得
  • LABELから文言を取得し、変数「^cnt」に代入します。
  • 「INSTR」で、「^cnt(xxx件中xx~xx件を表示)」で「件中」が現れる文字位置を、数値型変数「^len」に保存します。
  • 「LEFT」で、「^cnt」から、「件中」の直前(^len – 1)までを切り出して、^cntに上書きします。
  • Excel出力シート、B列「^i」行目に「^cnt」の値を出力します。

修正シナリオ(最終版)

実行結果

件数出力

「AーZ」に対し、正常時は件数とExcelシート、エラー時はエラーMSGが出力されています。

シート出力結果

シート「JIS_W」についても、重複することなく出力されています。