UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

左クリックするまでシフトキー押しっぱなし / にゃんこ
あけましておめでとうございます。
本年もよろしくお願いいたします。

マウスのカーソルがある位置から、左クリックが押されるまでシフトキーを押しっぱなしにして範囲の設定をしたいと思うのですが、うまく動作できません。

REPEAT
KBD(VK_SHIFT,DOWN,40)
UNTIL GETKEYSTATE(VK_LRBUTTON)

よろしくお願いいたします。

No.4931 2018/01/01(Mon) 08:29:04

Re: 左クリックするまでシフトキー押しっぱなし / にゃんこ
投稿するときに文字色を押してしまいました
No.4932 2018/01/01(Mon) 08:31:26
UWSCは動作を停止しました / pon
はじめまして。
フリー5.3.0.2を使用しています。
表題の通りUWSCで画像認識処理を1晩実行していると高頻度で発生します。
win7 64bit環境
uwsには下記のような処理を記載しておりそれぞれほぼ同様の記載で差異としては確認画像が異なる程度です
もし、UWSCを長時間実行しているのが問題。というのであれば、一定時間経過したらUWSCを終了させ、再起動させる処理のサンプルいただけますとありがたいです。

//画像選択A
IFB CHKIMG("Move.BMP",,,,,,IMG_MSK_BGR1)
BTN(LEFT,CLICK,576,609,300)
FUKIDASI("行動終了認識",750,500)
ELSE
FUKIDASI("Move.BMP認識に失敗しました。",750,500)
ENDIF

//画像選択B
 A同様の画像処理
...
//画像選択F
 A同様の画像処理

While True
  Call xx.uws
Wend

No.4887 2017/12/24(Sun) 07:35:51

Re: UWSCは動作を停止しました / まっさーや
自分もはじめまして。

長時間起動しぱなしにするとエラー出ることはありますね。

例えば、1時間毎に
・操作ウィンドウを閉じる
・UWSCを再起動させる
と↓の感じになるのかな。。(全角スペースを使ってるので、使うときは削ってください)


//定期確認用変数
Public Check_Point_Timer = gettime()

//無限ループ/////////////////////////////////////////
while true

    //今やってる処理を書く↓/////////

    /////////////////////////////////

    //定期的に確認
    checkPoint

wend
/////////////////////////////////////////////////////


Procedure checkPoint
ifb gettime() > Check_Point_Timer then

//Alt+F4を送り、ウィンドウを閉じる
SCKEY(ID,VK_ALT, VK_F4)

//UWSCの再起動
POFF(P_UWSC_REEXEC, True)

//次回60分後にチェックタイマー設定
Check_Point_Timer=gettime()+ 60 * 60
endif

FEND

No.4888 2017/12/24(Sun) 22:48:11

Re: UWSCは動作を停止しました / 森
無限ループは、sleep()を入れないとCPU使用率が100%になってPCがフリーズします。
While True
  Call xx.uws
  sleep(0.1) //----- これが必要
Wend

No.4890 2017/12/25(Mon) 11:11:08

Re: UWSCは動作を停止しました / pon
すみません。遅くなりました。
頂いたサンプルを動作させてみたのですが、SCKEY(ID,VK_ALT, VK_F4)でIDの指定がないと表示されるため、1行上に
ID =EXEC("UWSC")を記載してみたのですが、-1が帰ってきてしまうようでUWSCそのものを閉じることができませんでした。
また、SCKEY(GETID(xx),VK_ALT, VK_F4)と記載した場合は開きっぱなしのxx.uwsを閉じてしまい、その後はやはり-1を返してきます。
追加の質問になってしまいますが、UWSC.exeそのものを終了させることは可能でしょうか?

No.4929 2017/12/31(Sun) 04:46:48
かん / かん
FUKIDASIを複数出したり、
行ごとにフォントサイズを変更することは可能でしょうか?

No.4903 2017/12/26(Tue) 17:09:50

Re: かん / satocha
fukidasiは1スレッドに1つしか表示できなかった気がします。
私の場合は、複数必要なときは別UWSをexecで起動しています。
1本のスクリプトで実現したいなら、threadで別プロシジャを呼べばいいと思います。

一つ注意点。fukidasiの表示初期値はスクリーンの左上なので、複数出すと表示がかぶってしまいます。スレッド(スクリプト)ごとに別の場所に表示するといいでしょう。

No.4904 2017/12/26(Tue) 19:59:57

Re: かん / stuncloud
public flg = FALSE
thread fukidasi2("ひとつめ")
thread fukidasi2("ふたつめ", 0, 50)
thread fukidasi2("みっつめ", 0, 100)

msgbox("複数表示サンプル")
flg = TRUE

procedure fukidasi2(msg, x = 0, y = 0)
 fukidasi(msg, x, y)
 repeat
  sleep(0.1)
 until flg
fend

スレッドが終わるとふきだしも消えちゃうので関数内で待機ループが入っています
フラグが立ったら消えるようにします
個別のフラグ管理となるとちょっと実装が面倒になりますが不可能ではないです

> 行ごとにフォントサイズを変更することは可能でしょうか?
こっちはムリです
(ものすごく頑張るとできるかもしれないけど、それが労力に見合う成果なのかは疑問です)

No.4912 2017/12/28(Thu) 10:22:59

Re: かん / しゅん
> 行ごとにフォントサイズを変更することは可能でしょうか?

ものすごく頑張ればできます。
が、本当にがんばらないとできないので、別の方法を考えた方が良いです。

どうしてもがんばりたいなら以下がヒントです。
・一文字づつ色を変えられないか、以前検討した
http://d.hatena.ne.jp/junjun777/20120616/uwsc_color_fukidasi_no_dll
・これと同様に、自力でフォントサイズを変更しながら書けば可能
・ただし、Fukidasi自体のサイズをどうするかが面倒

No.4913 2017/12/28(Thu) 14:07:17

Re: かん / しろまさ
// スタンさんベースで誤魔化しました^^

public flg = FALSE
thread fukidasi2("ひとつめ")
thread fukidasi2("ふたつめ", 0, 13, 12)
thread fukidasi2("みっつめ", 0, 30)
thread fukidasiBG(0, 0, 5, 3)

Sleep(3)
flg = TRUE

procedure fukidasi2(msg, x = 0, y = 0, fs = 9)
 Fukidasi(msg, x, y, 0, fs, "", 0, 0, -2)
 repeat
  sleep(0.1)
 until flg
fend
procedure fukidasiBG(x, y, W, L)
 BG = Format(" ", W)
 For i = 2 To L
  BG = BG + "<#CR>"
 Next
 fukidasi(BG, x, y)
 repeat
  sleep(0.1)
 until flg
fend

No.4914 2017/12/28(Thu) 14:43:10

Re: かん / 森
// FUKIDASIではありませんが、こんなのはどうですか?
// HTMLベースなので、文字色、サイズ、背景色、行数、なんでも自由自在です。
// 複数表示だって、画像の表示だって可能です!

id1 = message(text1,10,0,200,80) // メッセージ1を表示
Sleep(0.5)
id2 = message(text2,10,100,250,200) // メッセージ2を表示
Sleep(0.5)
id3 = message(text3,300,50,300,120) // メッセージ3(画像)を表示
Sleep(3)
ctrlwin(id1, CLOSE) // 閉じる
ctrlwin(id2, CLOSE)
ctrlwin(id3, CLOSE)

// 吹き出しもどきを表示する
function message(str,x,y,w,h)
  // 表示用ファイルの生成
  hta_path = GET_CUR_DIR + "\hta_message.hta"
  f = fopen(hta_path, F_WRITE)
  fput(f, replace(hta_base,"{?hta_body}",str), F_ALLTEXT)
  fclose(f)
  // 表示してIDを返す
  result = exec("mshta.exe <#DBL>" + hta_path + "<#DBL>",false,x,y,w,h)
  // 表示用ファイルを削除
  deletefile(hta_path)
fend

// メッセージ1
textblock text1
<span class="big">本日は</span><span class="blue small">晴天なり</span>
endtextblock

// メッセージ2
textblock text2
<span class="orange">犬も歩けば</span><span class="big red">棒</span>に当たる<br />
<span class="pink small">いろはに</span><span class="green">ほへと</span><br />
<span class="small">自</span><span class="blue">由自</span><span class="orange small">在</span>
endtextblock

// メッセージ3
textblock text3
<img src="https://www.google.co.jp/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">;
endtextblock

// 吹き出しもどきの骨格
textblock hta_base
<html>
<head>
<hta:application caption="no" border="none" innerborder="no" scroll="no" showintaskbar="no">
<style>
.blue{color:blue;}
.red{color:red;}
.green{color:green;}
.orange{color:orange;}
.pink{color:pink;}
.big{font-size:2em;}
.small{font-size:0.7em;}
</style>
</head>
<body>{?hta_body}</body>
</html>
endtextblock

No.4917 2017/12/29(Fri) 12:15:24

Re: かん / しろまさ
お、面白そう!と実行してみましたが日本語が□に化けますね。
森さん、何か設定が必要ですか?

No.4920 2017/12/29(Fri) 14:14:47

Re: かん / 森
しろまささん
UTF-8の時は、<head></head>に以下を入れてください。
<meta http-equiv="content-type" content="text/html; charset=utf-8" />

さらに、表示用ファイルの生成も明示的にUTF-8指定しておく方と確実ですね。
f = fopen(hta_path, F_WRITE8)

No.4921 2017/12/29(Fri) 14:22:16

Re: かん / しろまさ
f = fopen(hta_path, F_WRITE8)
こっちで直りました。

スクリプトファイルはSJISにしてるのに変ですね。
Webページコピペするとなるのかな。

No.4923 2017/12/29(Fri) 17:50:34

Re: かん / 森
何年か前に、まだフォームが1つしか作ることができなかった時代ですが、
もう一つフォームを出したくて調べてた時に、HTAのことを知ったんです。
廃れて忘れ去られている技術のようですが、HTML+javascriptだけじゃなくて、
なんとVBAまで直接書き込んで動くというステキな仕組み!!
当然、AjaxとかjQueryとかも動くはずなので、今こそ時代が追い付いた?みたいに思えます。

本当は、DOMで直接UWSCから内容を書き換えたりしたいのですが、
COMオブジェクトが分らなくて、調べたけど全然情報が無くて断念(´;ω;`)ウゥゥ

ローカルファイルの読み書きもできるみたいなので、
とりあえずはファイル経由でデータのやり取りはできそうですが・・・

No.4924 2017/12/29(Fri) 18:38:37

Re: かん / satocha
森様
>jQueryとかも動くはず
jQueryのdatepickerを使い、UWSCで日付入力してみました。
一時HTAファイルを起動直後に消すのはまずいときもあるので、明示的に消去するほか、HTAを閉じたときも、UWSCを強制終了したときも、消えるようにしています。
fukidasiとは無関係で申し訳ないですが、見てやってください。
https://plaza.rakuten.co.jp/satocchia/diary/201712300000/

No.4927 2017/12/30(Sat) 12:25:39
特定の画像が出るまで処理を繰り返したい / azu
お世話になっています
初心者な質問で申し訳ないのですがどういう処理をしたらいいのかわからず
詰まってしまったでよろしければお答えいただけると嬉しいです

具体的には
ABCD。。。数種類の画像認識を行いクリック
Aの場合のみ最優先でそれ以外は優先度なし
(優先度を付けない方法がわからないので)
elseifで適当にBCDと優先順位をつけています(それでも問題なく動作しました)
その後画像EorFが出るまでクリックし
画像Fの場合はまたEが出るまでクリック
画像Eが出たらクリック
A以外から来た場合はABCDの認識に戻る
Aから来た場合はループを終了する

こういった場合はどういった処理をすればいいでしょうか?
よろしくお願い致します

No.4885 2017/12/23(Sat) 05:14:36

Re: 特定の画像が出るまで処理を繰り返したい / 森
回答付きませんね。
「具体的には」と書かれていますが、プログラムを書けるレベルの情報が足りないのです。
特に最初の方が全く分からないです(´;ω;`)ウゥゥ
途中や最後もあいまいな部分が多いです。
答えてあげたいのですが、想像で書くと後出し条件で書き直しばかりになりそうで・・・
もっと具体的に処理内容を書いてみてください。
それと、azuさんが書いているスクリプトを提示して「ここが分らない」みたいに書くと伝わりやすいです。

No.4902 2017/12/26(Tue) 16:52:35

Re: 特定の画像が出るまで処理を繰り返したい / azu
返信ありがとうございます
スクリプトで書いている物を出してご質問できれば一番なのですが
まったく思ったように動作しないので逆に混乱させてしまいそうなんです。。。

後から見てみると自分でもわかりにくいと思ったので
やりたい事を最初から書き直し、わからないとこを書いてみます

・やりたい事

1.ABCDの4つの画像がランダムで1〜3個出現し1つだけ選択しクリックします
Aが出た場合のみ優先してクリック。他の物は特に優先順位はありません
どれをクリックしても2へ

2.
上記の画像を1つクリックすると
画像Eが出る場合があり出た場合はクリック
その後画像Fがあるかを確認しなければ1へ戻る
あれば画像Fをクリックし3へ
画像Eが出ない場合は画像Fが出るので同じくクリックし3へ

3.
クリック等ある程度処理をして終了になるのですが
ここで1のABCDの内Aからここに来た場合は終了
A以外から来た場合は1に戻るとしたいのです


・わからない
特に1へ戻るという処理をどうすればいいのかわからず
またAからきた場合のみ終了にするのをどうしたらいいかと悩んでいます

自分ではBCDを選んだ場合は1へ戻る(ループ?)する処理をするようにし
Aを選んだ場合上記2,3とほぼ同じの処理ですが
最後だけ終了になっている処理分の場所へとしたらいいのかなと思ったのですが
調べても中々どうしたらいいのかわからず困り果てていました・・・


わかりにくかったら申し訳ありません。。
よろしくお願い致します

No.4909 2017/12/27(Wed) 21:26:57

Re: 特定の画像が出るまで処理を繰り返したい / しろまさ
森さんの優しい指摘で意味が解らないようなので端的に言うと
・ 作成依頼するから誰も答えない。
・ コードが無ければ間違いを指摘しようが無い。
ということ。
混乱してるのは azuさんですよ。混乱の原因を提示して下さい。

No.4910 2017/12/28(Thu) 09:06:08

Re: 特定の画像が出るまで処理を繰り返したい / stuncloud
> ネットゲーム関係の質問はご遠慮ください
っぽい気がするけど大丈夫ですか?大丈夫ですね?

やるとしたらこうです、たぶん完璧に要件を満たしていると思う

Aがクリックされた = FALSE
repeat
 // 1 select-caseによりAを優先的に処理できる
 select TRUE
  case chkimg(A)
   Aをクリック()
   Aがクリックされた = TRUE // Aがクリックされたらフラグを建てる
  case chkimg(B) or chkimg(C) or chkimg(D)
   BかCかDをクリック()
   // 完全に優先度なしというわけにはいかないけどどれかヒットすれば G_IMG_* に値が入る
   // 通常は左から見て最後に見つかったもの、SHORTCIRCUITなら左から見て最初に見つかったものになる
  default
   continue // ABCDいずれもなかったら1に戻る
 selend
 // 2
 if chkimg(E) then
  Eをクリック()
  if chkimg(F) then
   Fをクリック()
  else
   continue // Fがないので1に戻る
  endif
 else
  Fをクリック()
  continue // EがなかったのでFをクリックして1に戻る
 endif
 // 3
 残りの処理()
until Aがクリックされた // Aがクリックされていた場合は抜ける

細かい実装はご自分でお願いします
これでできないようでしたら諦めてください

No.4911 2017/12/28(Thu) 10:06:58

Re: 特定の画像が出るまで処理を繰り返したい / 森
しろまささん、stuncloudさん、フォローありがとうございます。
言った手前、私がスクリプト提示をするつもりでしたが、ホント、完璧に要件を満たしていると思います。
何となく多重ループや分岐の入れ子になりそうだと思っていたのですが、スッキリきれいに組み立てられていて、さすがだなぁ

No.4918 2017/12/29(Fri) 12:30:29

Re: 特定の画像が出るまで処理を繰り返したい / azu
森さん しろまささん
色々ご指摘ありがとうございます
分岐+ループをやろうとするとまったく上手くいかずお手本が欲しく
作成依頼の様な形になってしまいました
申し訳ありません

stuncloudさん
本当にありがとうございました
参考にさせて頂きながら試したところ上手くできたと思います
ネットゲーム関連ではありません
あるアルバイトで上手く手を抜けないかなと思い考えていました

No.4926 2017/12/30(Sat) 10:17:22
1回だけ〜 / ロボコップ
「A.bmpが出ない間、V.bmpが出たら右キーを1回押す」
を作りたいのですが

WHILE (CHKIMG("A.bmp")=FALSE)
IFB CHKIMG("V.bmp")
KBD(VK_RIGHT,DOWN)
KBD(VK_RIGHT,UP,50)
ENDIF
WEND

上記だとA.bmpが出なくてV.bmpが出る間、右キーが連発してしまいます。
右キーを“1回だけ”押すにはどうすればいいでしょうか?

No.4922 2017/12/29(Fri) 17:49:10

Re: 1回だけ〜 / 森
なんとデジャヴな・・・
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=4885

質問内容からは、希望動作がはっきり分かりませんので勘ですが、
1.画面上にAかVのどちらかが出現する
2.Aが現れたらクリックしてプログラムを終了
3.Vの場合はクリックして(クリックしたらVが消える)1に戻る

みたいな感じじゃないでしょうか。
だとしたら、WENDの前にsleep(1)ぐらいを入れれば良いと思います。

単純に、Vを1回押したらプログラムを終了すればいいのでしたら、
ENDIFの前にbreakです。

No.4925 2017/12/29(Fri) 19:15:34
CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
CREATEFORMで作成したフォームにボタンが有り、それを押す事によりFUNCTIONで指定した処理を行いたいのですがうまくいきません。<frame>を利用したかった場合であればうまくいくのですが、どこがまちがっているのでしょうか?(テスト.htmlを読込フォーム作成)


obj = CREATEFORM("テスト.html", "GETFORMDATA_SCRIPT", TRUE, FOM_NOHIDE, 1070, 700, 150, 0)
obj.Document.location.reload()
obj.Document.Frames["frame_hidari"].Document.write(frame_hidari)
obj.Document.Frames["frame_ue"].Document.write(frame_ue)
obj.Document.Frames["frame_migi"].Document.write(frame_migi)

//イベント呼び出し
OleEvent(obj.document.all.btnCalc, "HTMLButtonElementEvents", "onclick", "EventCalc")
//イベント呼び出し


while obj.visible
sleep(0.1)
wend


FUNCTION EventCalc()
MsgBox("「計算する」が押されました")
RESULT = "cal"
FEnd
---------------------
//テスト.html

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="C:\Users\Desktop\UWS\CREATEFORM\オリジナル\style.css">
<title>フレーム使用例</title>
</head>

<frameset cols="174,*">

<frame name="frame_hidari">
</frame>

<frameset rows="500,*">
<frame name="frame_ue">
</frame>

<frame name="frame_migi">
</frame>
</frameset>

<noframes>
このページはフレームを使用しています。
</noframes>
</frameset>



<body style="overflow:hidden;">
<form method="POST">
<div id=frame_hidari>
左テスト
</div>

<div id="frame_ue">
上テスト
<input type="button" id="btnCalc" value="計算する">

</div>

<div id="frame_migi">
右テスト
</div>
</form>
</body>
</html>

No.4905 2017/12/27(Wed) 11:25:04

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
訂正
<frame>を利用したかった場合→<frame>を利用しなかった場合

No.4906 2017/12/27(Wed) 11:26:31

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
過去の掲示板の下記のソースを参考にしています。

TextBlock frame_hidari
<HTML>
<BODY>
フレーム左
</BODY>
</HTML>
EndTextBlock

TextBlock frame_ue
<HTML>
<BODY>
フレーム上
</BODY>
</HTML>
EndTextBlock

TextBlock frame_migi
<HTML>
<BODY>
フレーム右
</BODY>
</HTML>
EndTextBlock


TextBlock GETFORMDATA_SCRIPT
<html>
<head>
<title>フレーム使用例</title>
</head>

<frameset cols="174,*">

<frame name="frame_hidari">
</frame>

<frameset rows="500,*">
<frame name="frame_ue">
</frame>

<frame name="frame_migi">
</frame>
</frameset>

<noframes>
このページはフレームを使用しています。
</noframes>
</frameset>

</html>
EndTextBlock

obj = CREATEFORM("about:blank", "GETFORMDATA_SCRIPT", TRUE, FOM_NOHIDE, 1070, 700, 150, 0)
obj.Document.write(GETFORMDATA_SCRIPT)
obj.Document.location.reload()
obj.Document.Frames["frame_hidari"].Document.write(frame_hidari)
obj.Document.Frames["frame_ue"].Document.write(frame_ue)
obj.Document.Frames["frame_migi"].Document.write(frame_migi)


while obj.Visible
 Sleep(0.1)
WEND

No.4907 2017/12/27(Wed) 11:27:55

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / 森
まずは、フレーム中身のwriteが、これではできないと思います。
参考にしたスクリプトと良く見比べてみてください。
次に、フレーム中身のwriteがちゃんとできた状態で試してみたのですが、DOM操作でエラーが発生しますね。

公式FAQによると、
  IEの操作(DOM)にて、フレーム内の操作ができない  #N37
  http://www.uwsc.info/faq.html#N37
  フレームが別ドメインまたはプロトコルが違う場合には、セキュリティの為に DOMでの操作はできません。
  しかし、UWSCのIE操作関連の関数であればアクセスができます。(Ver5.1.0以上)
  
とのことなので、それが原因かもです。
興味があったので色々やってみましたが、どうも難しいですね。
興味があったのは確かですが、やはり今どきフレームは・・・と思いました。
画面分割でしたら、STYLE使ってやった方が良いと思います。
もしくは、これも今風ではありませんがTABLEで。

No.4919 2017/12/29(Fri) 13:58:24
mouseorgの挙動 / うなご
mouseorg関数で第2引数が
1は座標情報をクライアント領域基準
2はクライアント領域基準化+直接ウィンドウに関数の操作を送る
という感じだと思うのですが、2の方をウィンドウ基準(タイトルバーの左上基準)もしくはスクリーン座標を基準にする方法などありますか?

3年前に組んだ低レベル操作のマクロがありそれを実行しながら別モニタで作業をしたいです。
mouseorg関数以外でもなにか思いつくことがあれば教えていただけるとうれしいです。。。

(使っている関数で位置が関係するのはMMV,BTN,CHKIMGです。操作的にはKBDも使ってます。。)

No.4915 2017/12/28(Thu) 23:05:26
Googleスプレッドシートのメニューのファイルをクリックする方法 / ゆう
Google Chromeのブラウザーでアクセスし、Googleスプレッドシートのメニューのファイルをクリックする方法が分かりません。下記のコードで試してみたのですが、うまくいきません。何か良い方法ないでしょうか?


id=GETID("Google スプレッドシート - Google Chrome")
CLKITEM(id, "ファイル")

No.4850 2017/12/16(Sat) 02:21:41

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / ゆう
下記のリンクにGoogleスプレッドシートの画像を貼りました。
https://gyazo.com/9fa0a30cbfd1914e430e77a9fed82814

No.4851 2017/12/16(Sat) 02:22:45

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / stuncloud
seleniumを使うなど、WebDriver経由での操作が確実だと思います
さすがにすごいDOM構造だったので骨が折れそうですが…

No.4869 2017/12/20(Wed) 11:02:54

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / satocha
メニューを開くだけなら下の方法でできました(ffとchromeクローンのvivaldiで確認。chrome未確認)。

ただ、ここから先はどうも難しそうです。DOM操作はstuncloudさんのおっしゃるとおり容易ではありません。たとえば、「ファイル」の部分はfilemenu=ie.getElementById('docs-file-menu')で取得できます(IEオブジェクト使用の場合)が、filemenu.click()としても何も起きません。seleniumは試していませんが、変わらない気がします。

それに、G社のサービスは頻繁な機能更新で有名です。苦労の末DOM解析ができたところで、それがいつまで使えるか不透明です。

シートの中身まで操作したいのであれば、手元にシートをダウンロードして操作したあと書き戻すなどしたほうがいいと思います。

-----------------------------------------------------------
id=GSpread.Focus( "無題のスプレッドシート" )
sleep(0.5)
GSpread.openMenu( "表示形式" )
sleep(1)
kbd(vk_esc)
GSpread.openMenu( "データ検索" )

module GSpread
public id =-1
hashtbl shortcut
procedure GSpread
for sc in split( shortcutdata, "<#CR>" )
ary =split( sc )
shortcut[ ary[0] ]=eval( "vk_" + ary[1] )
next
textblock shortcutdata
ファイル f
編集 e
表示 v
挿入 i
表示形式 o
データ d
ツール t
フォーム m
アドオン n
ヘルプ h
データ検索 x
シート選択 k
endtextblock
fend

function Focus( TitleOfSpreadSheet )
for id in getAllwin()
if pos( TitleOfSpreadSheet, status( id, st_title ) )
ctrlwin( id, activate )
break
endif
next
result =id
fend

procedure openMenu( menu )
kbd( vk_shift, down )
kbd( vk_alt, down )
kbd( shortcut[ menu ] )
kbd( vk_shift, up )
kbd( vk_alt, up )
fend
endmodule

No.4873 2017/12/20(Wed) 16:28:17

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
stuncloud様、btnでならできています。
No.4892 2017/12/25(Mon) 11:29:39

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
satocha様、chromeで教えて頂いたソース試してみましたが、ファイルをクリックせずデータ検索の画面になります。BTNで処理としてはできています、ありがとうございました。
No.4893 2017/12/25(Mon) 11:34:01

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / satocha
>ファイルをクリックせずデータ検索の画面になります
説明が足りなかったかもしれません。お示したのは、「表示形式」メニューを開いて閉じ、1秒後に「データ検索」を行う例です。

textblockの中にあるファイル、編集、表示…というメニューは皆、おなじやり方で呼べるようにしてあります。
「ファイル」なら、
GSpread.openMenu( "ファイル" )
でファイルメニューが開きます。

No.4895 2017/12/25(Mon) 16:36:54

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
satocha様、難しくてソースを読み解く事ができませんでした。希望通りの処理できました。
ありがとうございました。

No.4901 2017/12/26(Tue) 12:34:46
下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / はるか
下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか?
正規表現でパターンを組むのもどういうパターンにしたらいいか分かりませんですし、CHGMOJを使用しても一括置き換えになるのでできません。ご教授願いませんか?
---------------------

[元の文字列]
<#TAB>タイトル1<#TAB>タイトル2<#TAB>タイトル3<#TAB>項目0
項目1
項目2
項目3

[希望の処理]
<#TAB>タイトル1<#TAB>タイトル2<#TAB>タイトル3
項目0
項目1
項目2
項目3

No.4894 2017/12/25(Mon) 13:30:30

Re: 下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / 森
// 元の文字列中のタブが本当のタブじゃなくて、
// UWSCの特殊文字である"<#TAB>"の場合は、"<#" + "TAB>" などとして検索してください。
t4 = pos("<#TAB>" , before , 4) // 4つ目の{タブ}の位置
s1 = copy(before, 1 , t4 - 1)  // 4つ目の{タブ}より前
s2 = copy(before, t4 + 1)    // 4つ目の{タブ}より後
after = s1 + "<#CR>" + s2
msgbox(after)

// 正規表現
reg = CreateOLEObj("VBScript.Regexp")
reg.pattern = "((\t.*){3})\t"
after = reg.Replace(before, "$1<#CR>")
msgbox(after)

// {タブ}は本当のタブ
textblock before
{タブ}タイトル1{タブ}タイトル2{タブ}タイトル3{タブ}項目0
項目1
項目2
項目3
endtextblock

No.4896 2017/12/25(Mon) 19:10:39

Re: 下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / はるか
森様、提示頂きましたコードで希望通りの処理ができました。
posの使い方分かっていたつもりですが、私は理解できていなかった事を再認識できました。
正規表現むずかしいですね、勉強が必要だと認識できました。

No.4900 2017/12/26(Tue) 12:12:43
キーワードを検索した時に表示される説明文を取得する方法 / せきしんご
IEでキーワードを検索した時に表示される1位から10位までサイト名とURLは取得できるのですが、1位から10位までのdescriptionである説明文を取得方法が見つかりません。
IE.document.body.innerTEXTで取得してもひっかかりとなるパターンがないですし、IE.document.body.innerhtmlだと
下記のようなソースにパターンになっています。これを正規表現でパターンで検出でできればいいのですが、今の私では分かりません。何か良い方法ないでしょうか?

説明文の画像は下記。
https://gyazo.com/e304b640d92044074581051cc1cf79be
---------------------
ソース抜粋
<span class="st">文字列<em>文字列</em>文字列<em>文字列</em>文字列<em>文字列</em>文字列<em>エージェント</em>文字列</span>
---------------------
uws10位まで検索

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

tes =""
goo ="http://www.google.co.jp/search?hl=ja&lr=lang_ja&pws=0&q="
//key = INPUT("キーワードを入力してください")

IE.Navigate(tes+goo+url) // INPUT

BusyWait(IE)
Sleep(1)                  // JavaScriptの完了待ち
body = IEGetSrc(IE, "BODY")             // BODYのソース取得
body = Copy(body, Pos("<h3 ",body), 999999)       // h3タグ以下を取得
body = Copy(body, 1, Pos("background-position", body)) // 不必要部分の削除
cnt = 1
path="C:\Users\aa.xlsm" //データ出力先

Excel = XLOPEN(path)
XLSHEET( Excel,url)
while True
 wks= BetweenStr(body,"<h3 ","</h3>", cnt)
 if wks = EMPTY then break
 wks = REPLACE(wks,"<em>", "")    // 邪魔なタグは潰す
 wks = REPLACE(wks,"</em>", "")
 wks = REPLACE(wks,"</a>", "")
 title=Copy(wks, Pos("<#DBL>",wks,-1)+2, 999)   // タイトル
 url1=BetweenStr(wks, "href=<#DBL>","<#DBL>")  // URL

XLSETDATA(Excel, title, "b"+cnt)
XLSETDATA(Excel, url1, "c"+cnt)
 cnt = cnt + 1
wend


Procedure BusyWait(ie)
 repeat
  Sleep(0.2)
 until (! ie.busy) and (ie.readyState=4)
Fend
---------------------

No.4891 2017/12/25(Mon) 11:26:50

Re: キーワードを検索した時に表示される説明文を取得する方法 / 森
HTMLからデータを取得するのは、DOMの勉強をすると良いですよ。

// google_search.uws
// ------------------------------
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
keyword = encode(input("検索キーワード"), CODE_URL)
IE.Navigate("http://www.google.co.jp/search?hl=ja&lr=lang_ja&pws=0&q="+keyword)
repeat
 Sleep(0.2)
until (! ie.busy) and (ie.readyState=4)
sleep(1)
g = IE.document.getElementsByClassName("rc") // 個別データ
n = g.length - 1 // データ数

// 配列に格納
dim data[n][2]
for i = 0 to n
 COM_ERR_IGN
  data[i][0] = g.item[i].getElementsByTagName("a").item[0].innerText
  data[i][1] = g.item[i].getElementsByTagName("a").item[0].href
  data[i][2] = g.item[i].getElementsByClassName("st").item[0].innerText
 COM_ERR_RET
next

// CSVに出力
f = fopen("data.csv" , F_WRITE8B)
fput(f , "Title,URL,Description")
for i = 0 to n
 fput(f , mold(data[i][0]), i + 2 , 1 )
 fput(f , mold(data[i][1]), i + 2 , 2 )
 fput(f , mold(data[i][2]), i + 2 , 3 )
next
fclose(f)

function mold(s)
 // 改行を削除
 s = replace(s, "<#CR>", "")
 // ダブルクォーテーションをエスケープ
 s = replace(s, "<#DBL>", "<#DBL><#DBL>")
 // 前後にダブルクォーテーション
 result = "<#DBL>" + s + "<#DBL>"
Fend

// ------------------------------
2017/12/26 11:05
検索結果の途中で画像検索結果やショッピング等が入ると以降が取得できなかったため一部修正しました。
getElementsByClassName("g") → getElementsByClassName("rc")
TRY - ENDTRY → COM_ERR_IGN - COM_ERR_RET

No.4898 2017/12/26(Tue) 10:29:31

Re: キーワードを検索した時に表示される説明文を取得する方法 / せきしんご
森様、回答ありがとうございます。完璧に希望通りの処理です。
このような貴重なソースを提示頂き感謝です。
私ももっと学んでいこうと思います。(DOMの書籍、さっそくアマゾンで買いました)

No.4899 2017/12/26(Tue) 12:09:53


 過去ログ(〜2017/08/24)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> | 過去ログ ]