みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
qb_dp様ありがとうございます。無事置換できました。
お世話になっております。
ここに質問するのが適切かどうかわからないのですが、MarkDownThingを使ってみて、正規表現で置換文字列に改行を指定する方法がわかりません。\n、\r、\n\r、¶、はどれも効きませんでした。
何か方法があったら教えていただきたいです。
どうぞよろしくします。
himadaneeさん、Shinさん、ありがとうございます。
一応、以下のような方法で自己解決しました。
「スクリプトから変更されたか、ユーザーがキーボードから変更したか」を見張るフィールドを「テキストフィールド」とします。
「テキストフィールドの変更者」フィールドを用意しておきます。
レイアウト上の「テキストフィールド」にスクリプトトリガを設定し、OnObjectSaveで「値を変更」スクリプトが実行されるようにしておきます。
・ユーザーが値を変更したときは、必ずフィールドが選択された状態だと考えられるので、「テキストフィールド」=「Get(アクティブフィールド内容)」となります。
# 値を変更
# テキストフィールドにカーソルがあり、それの内容がフィールド内容と一致 → ユーザーによる変更とみなす
変数を設定 [ $アクティブフィールド内容が一致 ; 値: フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールド=Get(アクティブフィールド内容) ]
#
If [ $アクティブフィールド内容が一致 ]
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "ユーザー" ]
Else
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "スクリプト" ]
End If
・一方、スクリプトから値を変更する場合は、以下のようなスクリプトを用いて、フィールドからカーソルを外しておいて、値を変更し、変更者もスクリプトにするようにします。
# スクリプトから値を変更
フィールドへ移動 []
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールド ; "あああ" ]
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "スクリプト" ]
レコード/検索条件確定 [ ダイアログあり: オフ ]
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
以上のような方法で解決しましたが、もっとスマートな方法がありそうな気もします。
お世話になります。
タイトルそのままなのですが、「フィールドの値が、スクリプトから変更されたか、ユーザーがキーボードから変更したかを見分けたい」です。
何か良い方法がありますでしょうか?
他にもやっている人がすでにいそうなのですが、検索では見つけられませんでした。
どうかよろしくお願いします。
qb_dpさん、ありがとうございます。
できました! これでやりたいことが実現できそうです。
himadaneeさん、qb_dpさん、ご返信ありがとうございます。
とりあえずBE_RegularExpressionではできないことがわかったので、
qb_dpさんの代替案、JavaScriptを使う方法を試してみました。
しかし、意図した結果が出ません。「あ」などにマッチするはずが、なぜか存在しない文字列「w」にマッチしてしまいます。
どこがいけないのでしょうか?
アドバイスをお願いします。
キャプチャしたのは、ブラウズモードでの結果、レイアウトでのWebビューアのJavaScript、スクリプト2種類です。
(画像が大きくてすみません)
お世話になっております.
BaseElementsの、BE_RegularExpression関数を使って、改行区切りリストから、正規表現にマッチした値を取り出したいのですが、
以下のような式だと、「?」が戻り値となります。
(改行コードの問題なのか、正規表現の問題なのか、判断がつかないです)
どなたか、BaseElementsをお使いの方、いらっしゃいましたら教えていただけないでしょうか?
よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
While (
[
i=1 ; string = "あ¶い¶う¶" ; NumOfVals=ValueCount(string); result = "" //初期変数
] ;
i ≤ NumOfVals ; //継続条件
[
Val = GetValue(string ; i) ;
MatchReg = BE_RegularExpression ( Val ; "^.{1}" ; "gm" ) ;
result = result & If ( IsEmpty ( MatchReg ) ; "" ; MatchReg ) & "¶"; //マッチしないときはヌル、マッチすればその文字列を追加
i = i+1 //ロジック
] ;
result //結果
)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
qb_dp様
おっしゃる通りでした!
無事投稿できました!
ありがとうございました.
himadanee様,返信ありがとうございます.
ご指摘の通りに,「シングルクオートはやめて」,また,「テキストを挿入」と「変数を設定」が混在していたのを2行を1行にまとめて,
(ヘッダー部分とボディ部分をまとめて$$optに入れるようにして)
テキストを挿入 [ ターゲット: $$opt ; ]として,挿入内容を以下のようにしました
```````````````````````````````````````````````````````
-X POST
-H "Authorization: Bearer secret_************"
-H "Content-Type: application/json"
-H "Notion-Version: 2021-05-13"
--data "{ "parent": { "database_id": "************" },
"properties": {
"内容Text": {
"title": [
{
"text": {
"content": "これはテストです"
}
}
]
}
}
}"
```````````````````````````````````````````````````````
しかし,まだ同じエラーが出る状態です.
何か見落としているのでしょうか? お分かりになりましたらよろしくお願いします.
FileMaker Pro 19.3(Mac)から,NotionのAPIを叩いて,Notionのデータベースに投稿しようとして,四苦八苦しております.
ターミナルから以下のコマンドで投稿することはできています.
```````````````````````````````````````````````````````
cURL -X POST -H "Authorization: Bearer secret_************"
-H "Content-Type: application/json"
-H "Notion-Version: 2021-05-13"
--data '{
"parent": { "database_id": "************" },
"properties": {
"内容": {
"title": [
{
"text": {
"content": "これはテストです"
}
}
]
}
}
}'
```````````````````````````````````````````````````````
ところが,これをFileMakerのスクリプトから実行すると,次のようなエラーが出ます.
{"object":"error","status":400,"code":"invalid_json","message":"Error parsing JSON body."}
実行しているFileMakerスクリプトは以下のようなものです.
```````````````````````````````````````````````````````
変数を設定 [ $$res ; 値: "" ]
変数を設定 [ $$header ; 値: "" ]
変数を設定 [ $$opt ; 値: "" ]
テキストを挿入 [ ターゲット: $$header ; 「-X POST -H "Authorization: Bearer secret_************" \ -H "Content-Type: application/json; " \ -H "Notion-Version: 2021-05-13" \ 」 ]
変数を設定 [ $$opt ; 値: $$header & " --data '{ \"parent\": { \"database_id\": \"************\" }, \"properties\": { \"Name\": { \"title\": [ { \"text\": { \"content\": \"これはテストです\" } } …" ]
URL から挿入 [ 選択 ; ダイアログあり: オフ ; ターゲット: $$res ; "https://api.notion.com/v1/pages" ; cURL オプション: $$opt ; URL を自動的にエンコードしない ]
カスタムダイアログを表示 [ "結果" ; $$res ]
```````````````````````````````````````````````````````
文字コードまわりか,もしくはダブルコーテーションのエスケープでどこか見落としがあるか,その辺りかと思うのですが,
どうしても自分では見つかりません.
どなたか,FileMakerからNotionのAPIへの投稿で成功している方,お分かりになりませんでしょうか?
どうかよろしくお願いします。
qb_dp様
まさしく、求めていたものです。
ありがとうございます!
あるテキストフィールド「Text」に"あいうえお"というテキストが入っており,"お"だけが太字(Bold)になっている状態があるとします.
この状態で,
GetAsCSS ( Text )
を実行すると,結果は,
<span style="" >あいうえ</span><span style="font-weight: bold;" >お</span>
となります. (日本語文字は実体参照化されている)
しかし,自分が取得したい結果は
<span style="" >あいうえ</span><span style="font-weight: bold;" >お</span>
というものです.
(日本語の部分はそのままで,スタイルのタグだけを付けた状態にしたい)
これを実現する方法は何かありますでしょうか?
どうぞよろしくお願いします.
あるテキストフィールド「Text」に"あいうえお"というテキストが入っており,"お"だけが太字(Bold)になっている状態があるとします.
この状態で,
GetAsCSS ( Text )
を実行すると,結果は,
<span style="" >あいうえ</span><span style="font-weight: bold;" >お</span>
となります. (日本語文字は実体参照化されている)
しかし,自分が取得したい結果は
<span style="" >あいうえ</span><span style="font-weight: bold;" >お</span>
というものです.
(日本語の部分はそのままで,スタイルのタグだけを付けた状態にしたい)
これを実現する方法は何かありますでしょうか?
どうぞよろしくお願いします.
Shinさん,himadaneeさん,返信ありがとうございます.
そうですね.初めの式の設計が悪かったのです.
あきらめて1つ1つコピペすることにします.
ありがとうございました.
ファイルAで使っているカスタム関数の関数名は変えずに,式の内容だけファイルBのものと入れ替えたいのですが、どうするのが最も良い方法でしょうか?
・置き換えたい関数は多数あって、コピペは面倒なので,関数のインポートで置き換えたいのです。
自分で試してみたのは以下の方法です。
①今のファイルAの関数を削除してからインポート
→ 関数名の競合は起きないが,計算フィールドなどで使っている場合は「関数が見つかりません」になる
→ 後から同一名の関数をインポートしても,「関数が見つかりません」のまま。
②名前の競合は起きるのが前提で,いったんインポートしてから名前を変更
→ インポートすると,名前の競合により,「カスタム関数 2」などの序数がついてインポートされる
→ 元の関数を削除した後,2を取って元の名前にする
→ 計算フィールドなどで使っている場合は「関数が見つかりません」のまま。
①、②、どちらも計算フィールドやスクリプト上で、「関数が見つかりません」が出た場所を全てチェックしなければならないようです。
このような場合ベストな方法、定石のような方法はあるのでしょうか? それとも、コピペする方が良いのでしょうか?
Shinさん,qb_dpさん,ありがとうございます.Letはいらなかったようです.
以下の式でカスタム関数で動きました.失礼しました.
``````````````````````````````````````````````````````````
While (
[
~i = 1;
~lst= List( "いち" ; "に" ; "さん" ) ;
~ExactAns = "にばん" ;
~Ans = "";
~NumOfValues = ValueCount ( ~lst )
] ; //初期変数
~i ≤ ~NumOfValues and IsEmpty ( ~Ans );
//継続条件:全ての値をトライしたか、または、値が見つかったら終了
[
~tpAns = GetValue ( ~lst ; ~i ) ;
~LenTpAns = Length(~tpAns);
~ExactAnsLeft = Left ( ~ExactAns ; ~LenTpAns );
~i = ~i + 1 ;
~Ans = If (
Exact ( ~ExactAnsLeft ; ~tpAns ) ;
~ExactAnsLeft ; ""
)
] ; //ロジック。ぴったりの語が見つかれば,その直後に●を挿入,そうでなければ「なし」
If ( IsEmpty ( ~Ans ) ; "なし" ;
Substitute ( Left ( ~ExactAns ; ~LenTpAns ) ; ~tpAns ; ~tpAns & "●" ) & Right ( ~ExactAns ; Length ( ~ExactAns ) - ~LenTpAns )
) //結果 全ての値をトライしてなければ「なし」、あれば推定値
)
``````````````````````````````````````````````````````````
While関数を書き慣れなれていなくてすみません.
補足質問で恐縮ですが,LetとWhileを併用するべき場面,というのはどういうケースがありますでしょうか?
お世話になっております.
カスタム関数を作ろうと思い,以下のような式を書き,データビューワ上では意図した通りに動作することを確認できました.
やろうとしていることは,「にばん」という正解の語を左から読んで,
その中に,解答候補「いち」「に」「さん」のどれかが含まれていれば,その直後に「●」を挿入する,ということです.
(この例では「に●ばん」が出力される)
データビューワでは動作したので,$をチルダに置き換えて,カスタム関数として登録したところ,意図した動作になりません.
($を全て消去して,計算フィールドの定義として使用してみましたが同じでした)
何か単純な見落としではないかと思いますが,自分では思いつきません.
どなたか手助けいただけないでしょうか?
よろしくお願いします.
式:
``````````````````````````````````````````````````````````
Let ( [
$lst= List( "いち" ; "に" ; "さん" ) ;
$ExactAns = "にばん" ;
$Ans = "";
$NumOfValues = ValueCount ( $lst )
] ; //Let内の初期値
While (
[
$i = 1
] ; //初期変数
$i ≤ $NumOfValues and IsEmpty ( $Ans );
//継続条件:全ての値をトライしたか、または、値が見つかったら終了
[
$tpAns = GetValue ( $lst ; $i ) ;
$LenTpAns = Length($tpAns);
$ExactAnsLeft = Left ( $ExactAns ; $LenTpAns );
$i = $i + 1 ;
$Ans = If (
Exact ( $ExactAnsLeft ; $tpAns ) ;
$ExactAnsLeft ; ""
)
] ; //ロジック。ぴったりの語が見つかれば,その直後に●を挿入,そうでなければ「なし」
If ( IsEmpty ( $Ans ) ; "なし" ;
Substitute ( Left ( $ExactAns ; $LenTpAns ) ; $tpAns ; $tpAns & "●" ) & Right ( $ExactAns ; Length ( $ExactAns ) - $LenTpAns )
) //結果 全ての値をトライしてなければ「なし」、あれば推定値
)
)
``````````````````````````````````````````````````````````
Hiroさん、早速のお返事ありがとうございます。こんなにシンプルに出来たんですね。
カスタム関数化もできました。
大変お世話になりました。
1
2
3
5
7
8
などの整数値が改行区切りでフィールドに入っています。
これを、
1―3
5
7―8
という風に、「連続する整数ならダッシュつなぎでまとめる、そうでなければ、単独の数値として表記する」としたくてカスタム関数を書いてみたのですが、うまくいきません。
以下のように、処理する部分に分けて、2つの関数を書いてみて、この2つを何らかの方法で組み合わせることで、できそうな気がするのですが、複雑になりすぎて組み合わせ方がわかりません。
どなたか、わかる方がいらっしゃったら、アドバイスをお願いします。
■書いてみた1つ目の関数、RenzokuNum(lst)
------------------------------------------------------
/*RenzokuNum() ひと続きの連続の数字をダッシュつなぎでまとめる(1回のみ、単独の数字は処理しない)*/
Let([
$lst= SortValues ( lst ; 2 ); /*改行区切りのテキストを、数字としてソート縦郭*/
$CR="¶"; /*改行(関数内で、ダブルコーテーションをエスケープするのが面倒なので、変数に入れておく)*/
$null="";
$Dash="―";
$i=0;
$Itm = GetValue($lst; 1); /*現在の値*/
$NextItm= GetValue($lst; 2); /*次の値*/
$FirstItm = GetValue($lst; 1); /*n―mの開始値*/
$LastItm=$null; /*n―mの終了値*/
$res="";
$fnc=" /*$fnc開始*/
Case($NextItm - $Itm ≠ 1; $res; /*終了条件:現在の値と次の値の差が1でないなら終了*/
Let([
$i=$i+1;
$itm=GetValue($lst; $i); /*$i番目の値を取得*/
$NextItm=GetValue($lst; $i+1) ; /*$i+1番目の値を取得*/
$LastItm= $Itm ; /* 終了値を更新*/
$res=$FirstItm & $Dash & $LastItm & $CR /*ダッシュつなぎにして、改行を追加*/
]; Evaluate($fnc)) /*内側の$fnc計算*/
)
"
];
Evaluate($fnc) /*外側の$fnc計算*/
)
------------------------------------------------------
↑この関数は、
1
2
3
5
7
8
の入力を受け取ったとき、
1―3
のように、「最初の連続した数字をダッシュつなぎでまとめる」ことはできます。
■書いてみた2つ目の関数、StraightNum(lst)
------------------------------------------------------
/*StraightNum(lst)改行区切りの値全てをダッシュつなぎでまとめる(正常動作しない) */
Let([
$lst= SortValues ( lst ; 2 ); /*改行区切りのテキストを、数字としてソート*/
$CR="¶"; /*改行(関数内で、ダブルコーテーションをエスケープするのが面倒なので、変数に入れておく)*/
$null="";
$Dash="―";
$i=0;
$Itm = GetValue($lst; 1); /*現在の値*/
$NextItm= GetValue($lst; 2); /*次の値*/
$FirstItm = GetValue($lst; 1); /*n―mの開始値*/
$LastItm=$null; /*n―mの終了値*/
$res="";
$fnc=" /*$fnc開始*/
Case($i=ValueCount($lst); $res; /*Case文開始。終了条件:$iが値の数に達したら終了*/
Let(
[ /*内側のLet開始*/
$i=$i+1;
$itm=GetValue($lst; $i); /*$i番目の値を取得*/
$NextItm=GetValue($lst; $i+1) ; /*$i+1番目の値を取得*/
$FirstItm=If($FirstItm=$null ; $itm ; $FirstItm) ; /*$FirstItmがヌルなら取得しなおす。ヌルでなければそのまま*/
$LastItm=$itm ;
$res=Case( $NextItm -$itm ≠ 1 ; /*連続した数(差が1でない)ときの条件と計算式*/
Case($FirstItm = $itm ; $res & $itm & $CR ;
$FirstItm ≠ $itm ; $res & $FirstItm & $Dash & $LastItm & $CR )
;
$NextItm -$itm = 1 ; Let([ $LastItm = $null ] ; $res ) /*連続した数(差が1)のとき(出力しない)の条件と計算式*/
)
]; Evaluate($fnc)
) /*内側のLet終了、内側の$fnc計算*/
) /*Case文終了*/
"
];
Evaluate($fnc) /*外側の$fnc計算*/
) /*外側のLet終了*/
------------------------------------------------------
↑この関数は
1
2
3
5
7
8
の入力を受け取ったとき、
1―3
1―5
1―8
のように、「最初の開始値から、連続した数字をダッシュつなぎでまとめる」ことはできますが、2つ目以降の値の開始値が、最初に取得したもののままになってしまいます。
返信が遅れてすみません。
やはりグループ化しない方法はないようですね。
ポータル1つ1つに別々の条件付き書式を付けて、その見栄えを試したかったので、グループ解除→条件付き書式を設定し直す。→ボタン化、という手順が面倒に感じたので質問させていただいた次第です。
地道に作業することにしました。
1行ポータルをボタン化し、(ポータル全体、またはポータル内のフィールド1つをボタンにしたいと考えています)動作はするのですが、
その際、ポータルとフィールドがグループ化されてしまいます。
これをグループ化しないでボタン化する方法はあるのでしょうか?
どなたかご存じの方がいればご教示いただけたら幸いです。
Shinさん、ありがとうございました。確かに6,7行目、不要ですね。
動いていました。単なる自分の勘違いでした。
文字列中のひらがなの個数をカウントしたくて、カスタム関数を作ってみましたが、うまく動作しません。
どこが悪いのでしょうか? どなたかわかりましたらよろしくお願いします。
(ちなみに再帰を使ったカスタム関数、みなさんはどうやってデバッグしているのでしょうか?)
関数名:HiraganaCount()
引数:txt(下記の例では"航空センターあかし"を代入しています)
Let([
$txt="航空センターあかし";
$num = 0 ; /*ひらがなの個数*/
$len = Length($txt) ; /*文字列の長さ*/
$pos = 0 ; /*何文字目か*/
$tp = Middle($txt;$pos;1);
$code = Code($tp);
$fnc="Case($pos ≥ $len ; $num ; /*終了条件:最後の文字まで判定したら$numを返す*/
Let([
$pos = $pos+1;
$tp = Middle( $txt ; $pos ; 1);
$code = Code( $tp );
$num = $num + ($code ≥ 12353 and $code ≤ 12438)
]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
Shinさん、ありがとうございます。できました!
iを減らしていき、0になったら終了、に変更しました。
Let([
$res="カーネーションパーティー";
$Onbiki = "ー" ;
$i=PatternCount ( $res ; $Onbiki); /*音引きの個数*/
$fnc="Case($i= 0 ; $res ; /*終了条件:iが0になったら*/
Let([
$i=$i-1;
$OnbikiPos = Position ( $res ; $Onbiki ; 1 ; 1 ) ; /*音引きの位置(常に1個目)*/
$PreChar = Middle ( $res; $OnbikiPos-1 ; 1 ) ; /*音引きの直前の一文字*/
$ReplChar = /*音引きと置換する文字*/
Case (
PatternCount ( \"あぁかがさざただなはぱばまやゃらわアァカガサザタダナハパバマヤャラワ\" ; $PreChar ) ; \"ア\" ;
PatternCount ( \"いぃきぎしじちぢにひぴびみりイィキギシジチヂニヒピビミリ\" ; $PreChar ) ; \"イ\" ;
PatternCount ( \"うぅくぐすずつっづぬふぷぶむゆゅるウゥクグスズツッヅヌフプブムユュル\" ; $PreChar ) ; \"ウ\" ;
PatternCount ( \"えぇけげせぜてでねへぺべめれエェケゲセゼテデネヘペベメレ\" ; $PreChar ) ; \"エ\" ;
PatternCount ( \"おぉこごそぞとどのほぽぼもよょろオォコゴソゾトドノホポボモヨョロ\" ; $PreChar ) ; \"オ\" ;
\"■\");
$res = Replace ( $res ; $OnbikiPos ; 1 ; $ReplChar )
]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
micさん、ありがとうございます。やってみました。
下記のソースを計算フィールドに入れてみて、結果は「カアネーションパアティー」2番目と4番目だけ置換されないという動作がわかりません。
うーん、困りました。
Let([
$res="カーネーションパーティー";
$i=0;
$Onbiki = "ー" ;
$fnc="Case($i= PatternCount ( $res ; $Onbiki) ; $res ; /*終了条件:iが音引きの個数になったら*/
Let([
$i=$i+1;
$OnbikiPos = Position ( $res ; $Onbiki ; 1 ; $i ) ; /*音引きの位置(i回目)*/
$PreChar = Middle ( $res; $OnbikiPos-1 ; 1 ) ; /*音引きの直前の一文字*/
$ReplChar = /*音引きと置換する文字*/
Case (
PatternCount ( \"あぁかがさざただなはぱばまやゃらわアァカガサザタダナハパバマヤャラワ\" ; $PreChar ) ; \"ア\" ;
PatternCount ( \"いぃきぎしじちぢにひぴびみりイィキギシジチヂニヒピビミリ\" ; $PreChar ) ; \"イ\" ;
PatternCount ( \"うぅくぐすずつっづぬふぷぶむゆゅるウゥクグスズツッヅヌフプブムユュル\" ; $PreChar ) ; \"ウ\" ;
PatternCount ( \"えぇけげせぜてでねへぺべめれエェォケゲセゼテデネヘペベメレ\" ; $PreChar ) ; \"エ\" ;
PatternCount ( \"おぉこごそぞとどのほぽぼもよょろオォコゴソゾトドノホポボモヨョロ\" ; $PreChar ) ; \"オ\" ;
\"■\");
$res = Replace ( $res ; $OnbikiPos ; 1 ; $ReplChar )
]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
[ Generated in 0.019 seconds, 7 queries executed - Memory usage: 740.84 KiB (Peak: 810.99 KiB) ]