みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもありがたく拝見しております。
現在Win10&8.1混在 / FMS14 / FMP15,14混在 という環境で運用しています。
先日より、クライアントのPC入れ替えを部分的に行っており、今回officeアプリケーションを2013から2016にアップグレードしたところ、メールのテキストをコピーして検索ができなくなりました。
それまでは、メールが送られてきた際に、その中にある個人名のテキストを選択してCtrl+Cでコピーし、Filemaker側の個人情報が保存されているデータベースで検索モードにし、個人名の欄にペーストして検索実行→該当者ヒット、という流れでしたが、このごく一般的な検索作業をしようとすると、ヒットしません。(2013までは何の問題もなくヒットしました。)
何か怪しいなと思い、terapadに一度貼り付けて再度コピーし、検索したところ、ヒットします。
この問題のもとはMS Officeの問題なので、MS側で何とかしてほしいところですが、対応が遅そうなので、できるならば例えばTrim,TextFormatRemoveなどをスクリプトトリガなどで検索モードのみに仕込んだりで何とかならないかと考えてみたのですが、どうやら何か不可視の情報を引きずっているようで、それがわからず対処できずにおります。
何か、同種の問題に関しての情報でも構いませんので、解決の糸口をご教示いただければ幸いです。
Offline
Code() を使って、ペースとしてきたデータを見てみれば良いのでは。
Offline
「NULL文字」が入っているのでしょう。
GetAsCSS ( フィールド )で、値に「�」があれば、「NULL文字|コード0」が混じっています。
ちなみに、「NULL文字|コード0」は、FileMakerの Code(フィールド) では、何も返してくれません。
グローバルフィールドに「NULL文字|コード0」を入力し、置換すれば取り除けます。
以下が参考になります。
迷惑な「NULL文字|Code(0)」:
http://blog.joy-h.com/2014/09/nullcode0 … erpop.html
Last edited by qb_dp (2017-02-06 18:42:45)
Offline
Shin様、qb_dp様、ありがとうございます。(完了後改めて御礼させてください)
現在 ご提示いただいた2種の計算フィールドでOutlookで”山田”という文字列を表示させると、
Code()
13000133000023665
GetAsCSS()
<span style="" >山田<br/><br/></span>
という結果になりました。
ちょっと知識不足で、ここから調べる形になるのですが、取り急ぎ共有させていただきます。
・Null文字はなかったと思われますが、いかがでしょうか。
・見えない改行コードが2つもコピーされていました。(テキスト選択時には、改行部分はコピーしていない認識です。)
・Code()で”山田”相当の部分を除外すると、”1300013”が残ります。これが何か。何かわかったら、除去できるのか、が課題です。
・Filemaker本体に何か問い合わせを投げるべき内容でしょうか。
Offline
ブラウザやHTMLメール 上でコピーを行うと意図しない"モノ"がコピーされることがあります。
>見えない改行
改行は、目視出来ると思いますので削除すれば、良いと思いますが。
そのフィールドに改行を入れる必要が無く、自動で改行を取り除きたいなら、
「入力値の自動化」->「計算値」で、Substitute ( Self ; "¶" ; "" ) このようにすれば良いです。
ブラウザやHTMLメール 上でコピーをしていたら、そのうち「Null文字」が出て来ます。
Offline
まずはNull文字の件ありがとうございます。
見えない改行と記載したのは、理由がありました。
・検索モードでペーストすると、改行は表示されないが、ブラウズモードで新規レコードでペーストすると改行が現れる。
・「入力値の自動化」->「計算値」で、Substitute ( Self ; "¶" ; "" )を設定することで、この改行は除去できた。
・除去後の文字列をFilemaker上で再度コピーして検索すると、正常にヒットする。
検索モードで、ペーストした後に、ご教示いただいたSubstitute ( Self ; "¶" ; "" )をスクリプトトリガに指定すればいいか?と考えたのですが、期待通りに動作しません。
現状、スクリプトトリガを当該フィールドのOnObjectExitの検索モードに設定していますが、上記のような動作をさせたいと考えた場合の設定が誤っているのかも、と疑っております。
Offline
同様の問題を抱えている方が、外部サイトにいらっしゃいました。
何か解決の糸口になればと思い、共有させていただきます。
https://outlooklab.wordpress.com/2016/0 … %E3%83%AD/
Offline
「NULL文字|Code(0)」の対応は、まだなんですね。それで解決しますよ。
ブラウズモード と 検索モードで ペーストの共同が違いますね。(あまり、気にしてなかった。)
検索モードで、ペーストした後に、以下を実行してみて下さい。「�」があるはずです。
カスタムダイアログを表示 ["!"; GetAsCSS ( フィールド )]
また、コーピーした文字列に、「NULL文字|Code(0)」が含まれている場合、ブラウズモードで「Ctrl+Shift+V」でプレーンテキストの貼り付けになるので、
GetAsCSS ( フィールド )で「�」が確認出来ます。
また、「NULL文字|Code(0)」がある場合、キーボードの左右矢印キー を押して、カーソル移動しない場所があれば、そこに「NULL文字|Code(0)」が含まれています。
Offline
あと、改行は、関係ないですね。検索値に改行があっても 検索出来ます。
・検索モードでペーストすると、改行は表示されないが、ブラウズモードで新規レコードでペーストすると改行が現れる。
この現象は、検索モードでペーストの場合は、プレーンテキストでペーストが行われ、Null文字以降がペーストされていない。
ブラウズモードでは、リッチテキストでペーストが行われ 全文ペーストされる。
という感じでしょう。
ちなみにこの、「Null文字以降がペーストされていない。」という現象は、Notepad(メモ帳)でも発生します。
Offline
Null文字除去方法:1
ターゲットフィールドに
スクリプトトリガ:OnObjectExit|次で有効:検索
実行するスクリプト
フィールド設定[ターゲットフィールド ; Substitute ( ターゲットフィールド ; Null文字が入っているグローバルフィールド ; "" )]
Offline
Null文字除去方法:2
(Null文字が入っているグローバルフィールドを使用しない)
ターゲットフィールドに
スクリプトトリガ:OnObjectExit|次で有効:検索
実行するスクリプト
フィールド設定[ターゲットフィールド ;
/*
Hiroさん作:Max2万文字位まで生ける負荷分散した再帰式
*/
Let([
$prm0=Substitute ( GetAsCSS ( ターゲットフィールド ) ; "�" ; "" );
$prm=Evaluate ( Substitute ( Quote ( $prm0 ) ; ["<" ; "\" & Evaluate ( Let ( _ = \""] ; [">" ; " \" ; \"\" ) ) & \""] ) );
$m=150; /*再帰分割単位数(最適値指定)*/
$all=PatternCount($prm;"&#");
$n[1]=0;
$n[2]=Div($all-1;$m);
$res[1]="";
/*再帰計算限界回避の分割・分散処理*/
$fnc[1]="Case(
$n[1]>$n[2]; $res[1] & $prm;
Let([
$i[1]=$m*$n[1];
$i[2]=$i[1]+Min($all-$m*$n[1]; $m);
$pos=Position($prm;\"&#\";1;1);
$res[2]=\"\";
$res[1]=$res[1] & Evaluate($fnc[2]);
$n[1]=$n[1]+1
]; Evaluate($fnc[1]))
)";
/*主要式*/
$fnc[2]="Case(
$pos=0 or $i[1]=$i[2]; $res[2];
Let([
$i[1]=$i[1]+1;
$res[2]=$res[2] & Left($prm;$pos-1);
$prm=Middle($prm;$pos;Length($prm));
$p=Position($prm;\";\";1;1);
$chr=Left($prm;$p);
$chr=Char(Substitute($chr;[\"&#\";\"\"];[\";\";\"\"]));
$prm=Middle($prm;$p+1;Length($prm));
$res[2]=$res[2] & $chr;
$pos=Position($prm;\"&#\";1;1)
]; Evaluate($fnc[2]))
)"
];
Evaluate($fnc[1])
)
]
上記 式の書き換えるトコロは、「ターゲットフィールド 」のみ。
Last edited by qb_dp (2017-02-09 19:40:50)
Offline
Null文字除去方法:3
プラグイン使用
ターゲットフィールドに
スクリプトトリガ:OnObjectExit|次で有効:検索
実行するスクリプト
フィールド設定[ターゲットフィールド ; SMPS_Exe( Quote ( ターゲットフィールド ) )]
ScriptMakerPSは、邪魔なNull文字を除去するようになっているので、文字を渡すだけでNull文字を除去した文字列を返します。
FileMakerのフィールドに記述した「PowerShell」を実行し、戻り値を取得。
ScriptMakerPS | FileMaker Plugin for Windows : https://sites.google.com/site/scriptmakerps/
Offline
Null文字除去方法:4
末尾にNull文字がある場合。ほとんどコレでまかなえるかも。
ターゲットフィールドに
スクリプトトリガ:OnObjectExit|次で有効:検索
実行するスクリプト
フィールド設定[ターゲットフィールド ; Left ( ターゲットフィールド ; Length ( ターゲットフィールド )-1 )]
Offline
NULL文字を消すには
Substitute ( text ; Base64Decode ( "AA==" ) ; "" )
あ〜!base64が使えたんですね〜。
勉強になりました。
Offline
qb_dpさん、ぽんかんさん 本当にありがとうございます。
Base64DecodeをOnObjectExitで動かしたところ、見事検索できました!
仕組みを知りたいのですが、この AA== というのがなぜNull文字というのを指すのでしょうか?何故これがOutlook2016でくっついてくるのかが疑問です。この状況をMicrosoft側にはフィードバックしてみようと思います。
https://answers.microsoft.com/ja-jp/mso … ec70e9be57
ちなみにFilemaker社のサポートに電話で質問したところ、Outlook側のコピー、貼り付けの設定値をいくつかいじってみるように指示されましたが、結果は変わりませんでした。
MS側が改善されるまでは、ひとまずひたすらこのトリガをフィールドに埋めまくる日々になりそうです。
本当にありがとうございました!
Offline
ひとまずひたすらこのトリガをフィールドに埋めまくる日々になりそうです。
すでに以下のような設定にしているかもしれませんが...。
たくさんのフィールドに設定したい場合、以下のようにすれば、スクリプトは、一つで済みます。
フィールドのスクリプトトリガの引数に以下を設定し、
Get ( アクティブフィールドテーブル名 ) & "::" & Get ( アクティブフィールド名 )
スクリプト名:OnObjectExit_*****
変数を設定 [$FN; 値:Get(スクリプト引数)]
If [IsEmpty ( $FN )]
現在のスクリプト終了 []
End If
フィールドを名前で設定 [$FN; Substitute ( Evaluate ( $FN ) ; Base64Decode ( "AA==" ) ; "" )]
※
Substitute ( text ; Base64Decode ( "AA==" ) ; "" )
この方法でのNull文字の置換は、FileMaker 14・15 で可能です。(FileMaker 13 では、Base64Decode ( "AA==" ) で、 Null文字を返しません。)
Offline
もう一つ。
以下のスクリプトなら、レイアウト の スクリプトトリガ:OnRecordCommit に設定するだけで、全フィールドカバーできます。
全フィールド 置換するようになりますが、検索モードの時のみの動作なら特に問題無いでしょう。
スクリプト名:OnRecordCommit _*****
変数を設定 [$fields; 値:FieldNames ( Get ( ファイル名 ) ; Get ( レイアウト名 ) )]
変数を設定 [$Table; 値:Get ( レイアウトテーブル名 )]
変数を設定 [$MAX; 値:ValueCount ( $fields )]
変数を設定 [$n; 値:1]
エラー処理 [オン]
Loop
Exit Loop If [$n>$MAX]
変数を設定 [$FN; 値:GetValue ( $fields ; $n )]
If [PatternCount ( $FN ; "::" ) = 0]
変数を設定 [$FN; 値:$Table & "::" & $FN]
End If
フィールドを名前で設定 [$FN; Substitute ( Evaluate ( $FN ) ; Base64Decode ( "AA==" ) ; "" )]
変数を設定 [$n; 値:$n+1]
End Loop
Offline
Pages: 1
[ Generated in 0.017 seconds, 9 queries executed - Memory usage: 565.95 KiB (Peak: 586.85 KiB) ]