いいね!数

0

閲覧数
559

別に起動してるIEに表示されているページにNotesから値をセットしようとして悪戦苦闘しています。

何方かアドバイスかヒント頂けないでしょうか?

VBAでの事例は検索で見つけたのですが、Notesスクリプトへの置き換えが今ひとつ旨くいきません。

Dim colSh As Variant    
Dim n As Integer
Dim i As Integer
Dim strTEXT As String
Dim ANS As Integer

Set colSh = CreateObject("Shell.Application")

Forall win In colSh.Windows
If Typename(win.document) = “HTMLDocument” Then
If Instr(win.document.Title, “PAGE_TITLE”) > 0 Then
 Set objIE = win
 Exit Forall
End If
End If
End Forall
 'データをセットする

objIE.Document.Frmn.NameA.Value = txtID


Forallで「自動オブジェクトのメンバが見つかりません」で止まってしまいます。

サーバー情報:Windows2008Server9.01 | クライアント情報:windows109.01IE | 
カテゴリ:アプリ開発 - Notes アプリ | タグ:
  | 質問日時:2018/03/15 16:28:57

回答・コメント

いいね!数

0

Ryuuichi様

やりたいことは以下のリンクで紹介されているようなことですか?

http://goomino.blog9.fc2.com/blog-category-5.html

 

mak

回答日時:2018/03/15 18:03:17

いいね!数

0

mak様

早々のアドバイスありがとうございました。

やりたいことは紹介頂きましたリンク先の事例のようなものです。

参考にしながら試行錯誤していますが、読み込まれたHTMLソース上のINPUT位置を特定するスクリプトで悪戦苦闘しています。

もう少し具体的な事例があれば助かるのですが....

回答日時:2018/03/16 17:01:53

いいね!数

0

inputタグをみつけるのに困ってるわけですね。

id属性が指定されてるなら、ie.Document.body.getElementById(id)

name属性が指定されてるなら、ie.Document.body.getElementByName(id)

どちらも指定されてないなら、ie.Document.body.getElementByTagName(“input”)で配列をgetして、決め打ちでn番目のタグ、という感じでタグを特定します。

/Yac

回答日時:2018/03/16 22:44:31

いいね!数

0

yac4423様

アドバイスありがとうございました。
最初の質問時掲載のコードを試しにmak様アドバイスのLink先を参考に以下のように修正してみました。
デバッグの結果は
「インスタンスのメンバーgetElementByNameは存在しません」
というメッセージで止まってしましました。

スクリプトデバッグモードでエリアの取得内容を確認しましたが、「Object]表示で具体的内容は分かりませんでした。

コード内容を一行一行確認していますが、正直手詰まり状態です。

どなたかアドバイス頂けると助かります。


Dim colSh As Variant    
Dim n As Integer
Dim i As Integer
Dim strTEXT As String
Dim ANS As Integer
Dim IExplore As Variant
Dim IExplores() As Variant

Set colSh = CreateObject("Shell.Application")
Set Win = colSh.Windows()

For i = Win.Count To 1 Step -1
 Set IExplore = Win.Item(Win.Count - i)
If IExplore.Document.body.getElementByName("DomainUserName") Then
Redim Preserve IExplores(e)
Set IExplores(e) = IExplore
e = e + 1
End If
Next
 'データをセットする

IExplore.Document.DomainUserName.Value = txtID

回答日時:2018/03/17 17:48:58

いいね!数

0

まずは私の回答にちょっとミスがありました。

タグ名で要素の配列を得るメソッドはgetElementsByTagName()でした。要素の配列を得るんですから複数形じゃないと。申し訳ない。

 

さてサンプルを読んでみて、いろいろ疑問が。

Set colSh = CreateObject("Shell.Application")
Set apps = colSh.Windows()

はIEやエクスプローラーの配列を取得するメソッドっぽいですね。

apps.item(index)がindex番目のアプリケーション(IEかエクスプローラ)を返すメソッドっぽい。

だけどサンプルコードは目的のIEかどうか特にチェックしてないような。

IEかエクスプローラを区別するにはnameメソッドが使えますかね。

IEだとわかったら、次は目的のページを表示してるIEかどうかを何かを方法で判定しないといけない。

IEならapp.Document.title()が使えるかも。

LotusScriptは苦手なので意味がある程度伝わる擬似コードで書いてみます。

Set colSh = CreateObject("Shell.Application")
Set apps = colSh.Windows()  # アプリの配列
Forall app In colSh.Windows
  if (app is not Nothing) &&u (app.name == "Internet Explorer") then
    if (app.document.title == "目的のタイトル") then
      set tags = app.Document.body.getElementsByName("input")
      tags.item(3).value = "hogehoge"  # 3番目のinputタグに書き込む場合
    end if
  end if
End Forall

しかし、こんな方法ですでに開いてるIEにアクセスできちゃうんだぁ。

IEが機密情報ばりばりの危ないページを開いてたときに、Notesのボタンを押すとIEから情報が漏れそう。

技術的にはできるかもしれないけど、あまりやっちゃいけないことのような気もします。

/Yac

回答日時:2018/03/18 22:28:38

いいね!数

0

yac4423様

早々、詳細なアドバイスありがとうございました。
ご教授頂きましたスクリプトで早々試してみました。
結果
Forall app In colSh.Windowsの所で「自動オブジェクトのメンバーが見つかりません」でエラー発生となりました。
そこで、最初にアドバイス頂きました「ピヨパパ日記」様のスクリプトを参考に試行錯誤の結果なんとか当該のHTML要素を読み取る所までは可能となりました。
これをベースに当初やりたかったWeb上に表示されている当該箇所にNotes上の値をセットすることにしたのですが、HTML解析の結果、当該箇所は「インラインフレーム」での表示形式となってることが判明しました。

色々と調べた結果、「インラインフレーム」表示部分への値セットは表示部分を読み取っただけではセットできないことが判りました。
この時点で現在の自分の知識では解決することが難しいと判断し、別の方法を模索することにしました。

ご丁寧にアドバイス頂きました、「mak様」「yac4423様」ありがとうございました。
色々と勉強になりました。
本件は一応これで解決とさせて頂きます。

追伸
「yac4423様」ご指摘の
>技術的にはできるかもしれないけど、あまりやっちゃいけないことのような気もします。

確かにその面はあるかもしれませんね。
最終的には技術者側のモラルハザードに依るところが大きいのかもしれません。

因みに今回やろうとしていた意図は、
Web使用時にユーザーに通知してある使用者Passを入れさせているのですが、使用者によっては使用者Passをポストイットに記入して貼って運用しているというPassの意味をなさない場面があったことから、Passを通知せずNotesから自動入力させようとしたわけです。
これとて最終的には使用者側のモラルハザードに依ると言ってしまえば同じような事なのかもしれませんが.....

回答日時:2018/03/19 9:55:30

いいね!数

0

ちなみにインラインフレームにアクセスする時は、

ie.Document.frames(index)で、index番目のフレームを取得可能です。

戻り値はieクラスと同じようなもの。こんな感じで要素にアクセスします。

set targetframe = ie.Document.frames(TARGETINDEX)

set body = targetframe.Document.body

インラインフレームの中にまた別のフレームが含まれてる事もあるんで、途中で挫折しそうになりますけどね。

/Yac

回答日時:2018/03/19 12:44:23

いいね!数

0

自己解決しました。

本件に関しては、時間的制約もあったので別の方法で実施しましたが、時間的余裕が出来たので経験のために再チャレンジしました。

ポイントとしてはインラインフレームの扱い方でした。

色々調べた結果、インラインフレームはそのままではアクセス処理が出来ないので当該のURLを新規で開き直すと言うのが肝となりました。

こうすることで通常のオブジェクト要素として取り扱う事が可能となり、当初目的の処理をすることが出来ました。

回答日時:2018/04/16 13:12:01