文字列から一定の文字列を抜き出す必要があり、Geminiに対応してもらったのでその経緯等紹介します。
今回も自分では1行もプログラミングせずにGeminiに作ってもらうための具体的なプロンプトの入力内容を紹介していきます。
Genimiにエクセルで取得できるように依頼
早速ですが、以下をGeminiに相談しました。
『エクセルでA1セルに入っている「AAA-BBB-CC-DD」という文字列から、CCを抜き出したい。それぞれAAA等の文字列は可変長とする。
①エクセルの関数での取得方法
②VBAのFunction』
Geminiの回答は以下の通りでした。
① エクセルの関数での取得方法
MID関数とFIND関数を組み合わせることで、目的の文字列を抽出できます。
=MID(A1,FIND("-",A1,FIND("-",A1)+1)+1,FIND("-",A1,FIND("-",A1,FIND("-",A1)+1)+1)-FIND("-",A1,FIND("-",A1)+1)-1)
MID関数: 指定された文字列から、指定された位置から指定された文字数分の文字を抽出します。
FIND関数: 指定された文字列の中で、指定された文字または文字列が最初に現れる位置を返します。
解説:
FIND("-",A1): A1セル内の最初の"-"の位置を求めます。
FIND("-",A1,FIND("-",A1)+1): A1セル内の2番目の"-"の位置を求めます。
MID関数で、2番目の"-"の次の文字から、3番目の"-"の前の文字までの文字を抽出します。
より分かりやすいように、数式を分解して説明すると:
=MID(A1, FIND("-",A1,FIND("-",A1)+1)+1, FIND("-",A1,FIND("-",A1,FIND("-",A1)+1)+1)-FIND("-",A1,FIND("-",A1)+1)-1)
↑ ↑ ↑
文字列 開始位置 文字数
試してみました。
できましたね。
② VBAのFunction
VB.Net
Function ExtractThirdString(str As String) As String
Dim firstDash As Integer
Dim secondDash As Integer
Dim thirdDash As Integer
firstDash = InStr(str, "-")
secondDash = InStr(firstDash + 1, str, "-")
thirdDash = InStr(secondDash + 1, str, "-")
If thirdDash > 0 Then
ExtractThirdString = Mid(str, secondDash + 1, thirdDash - secondDash - 1)
Else
ExtractThirdString = "" ' 3つ目の"-"が見つからない場合
End If
End Function
セルに入力する際は、=ExtractString(A1)のように使用します。
試してみました。
コピペでOKですね!!
スプレットシートでも取得する方法を聞いてみた
『エクセルでA1セルに入っている「AAA-BBB-CC-DD」という文字列から、CCを抜き出したい。それぞれAAA等の文字列は可変長とする。
③スプレットシート関数での取得方法
④GasのFunction』
こちらも同じように聞いてみました。
回答は以下の通りでした。
③ スプレッドシート関数での取得方法
REGEXEXTRACT関数 を使うと、正規表現で柔軟に文字列を抽出できます。
=REGEXEXTRACT(A1, "-(.*)-")
REGEXEXTRACT関数: 指定された文字列から、正規表現に一致する部分を抽出します。
"-(.*)-": ハイフンで囲まれた任意の文字列(つまり、CCの部分)を抽出する正規表現です。
もう少し詳しく:
. (ピリオド): 任意の一文字を表します。
* (アスタリスク): 直前の文字 (ここでは.) が0回以上繰り返されることを意味します。
() (丸カッコ): マッチした部分をグループ化します。このグループ化された部分が、REGEXEXTRACT関数の戻り値となります。
④ GAS (Google Apps Script) のFunction
JavaScript
function extractCC(str) {
var regex = /-(.*)-/;
var match = str.match(regex);
if (match) {
return match[1];
} else {
return "";
}
}
この関数をスプレッドシートのカスタム関数として登録し、=extractCC(A1) のように使用します。
正規表現: JavaScriptでも、スプレッドシート関数と同様に正規表現が使えます。
matchメソッド: 文字列と正規表現を照合し、一致する部分を含む配列を返します。
match[1]: グループ化された部分 (つまり、CCの部分) を返します。
どちらの方法を選ぶべきか
シンプルに済ませたい場合: スプレッドシート関数
より複雑な処理が必要な場合: GAS
他のスクリプトと連携したい場合: GAS
GASのメリット:
柔軟性: 正規表現だけでなく、様々なJavaScriptの機能を利用できます。
自動化: トリガーを設定することで、特定のイベントが発生した際に自動で処理を実行できます。
カスタマイズ: スプレッドシートに合わせて自由に関数を作成できます。
スプレッドシート関数のメリット:
手軽さ: スプレッドシート上で直接数式を入力できます。
可視化: 計算過程が分かりやすく、デバッグが容易です。
補足
正規表現: 正規表現は、文字列の検索や置換を強力に行うためのツールです。様々なパターンに対応できます。
GASの学習: GASの学習には、JavaScriptの基礎知識があると役立ちます。
どちらの方法を選ぶかは、あなたのスキルやプロジェクトの要件によって異なります。
より複雑な抽出を行う場合:
複数の文字列を抽出: 正規表現のパターンを調整します。
条件分岐: if文やswitch文を使って、条件に応じて処理を分岐させます。
繰り返し処理: for文やwhile文を使って、複数のセルに対して処理を行います。
ご不明な点があれば、お気軽にご質問ください。
例:
もし、"AAA-BBB-CC-DD-EE" という文字列から、3番目のハイフンと4番目のハイフンの間の文字列を抽出したい場合は、正規表現を -(.*)-(.*) のように変更します。
より具体的な質問があれば、より詳しい回答をさせていただきます。
例えば、"AAA" や "DD" の部分も抽出したい、といったご要望があれば、そのための正規表現やGASのコードを提示できます。
スプレッドシート関数での修正
『CCだけ取得したい』と追加で依頼しました。
問題点の分析
=REGEXEXTRACT(A1, "-(.*)-") という式では、2つのハイフンで囲まれたすべての文字列が抽出されてしまうため、BBB-CC となってしまいます。
解決策
ハイフンで区切られた3つ目の部分だけを抽出するために、正規表現を調整します。
=REGEXEXTRACT(A1, "-\w+-(\w+)-")
解説:
-\w+-: ハイフン、1文字以上の単語、ハイフンというパターンにマッチします。これは、最初の2つの部分(AAA-BBB)に対応します。
(\w+): 1文字以上の単語をグループ化します。このグループ化された部分が、REGEXEXTRACT関数の戻り値となります。
この正規表現では、3つ目のハイフンの前の部分を無視し、3つ目のハイフンと4つ目のハイフンの間の部分だけを抽出します。
まとめ
修正後の式:
=REGEXEXTRACT(A1, "-\w+-(\w+)-")
この式をスプレッドシートのセルに入力することで、A1セルの「AAA-BBB-CC-DD」から「CC」だけを抽出することができます。
\w について:
\w は、単語を構成する文字 (文字、数字、アンダースコア) にマッチします。
この場合、CC が単語として扱われるため、\w+ で正しく抽出できます。
その他の注意点:
文字の種類: 抽出したい文字が必ず英数字であるとは限らない場合は、\w の代わりに . (任意の一文字) を使用することもできます。ただし、この場合は、スペースや記号も含まれてしまう可能性があります。
ハイフンの数: データの形式が常に「-」で区切られているとは限らない場合は、正規表現を調整する必要があります。
この修正によって、目的の文字列「CC」を正確に抽出できるはずです。
さて、抽出できるでしょうか?
やってみました。
できましたね。
④も同じ修正ですね。
「-\w+-(\w+)-」と指定するとうまくできましたね。
ちなみにSplitを使用した関数にしたい
『④をSplitを使用して』と指定すると
GAS (Google Apps Script) で Split 関数を使って文字列を抽出する
Split 関数とは?
Split 関数は、文字列を指定した区切り文字で分割し、その結果を配列として返す関数です。この機能を活用して、"AAA-BBB-CC-DD" のような文字列をハイフンで分割し、必要な部分を取り出すことができます。
コード例
JavaScript
function extractCCWithSplit(str) {
// ハイフンで分割
var parts = str.split('-');
// 3番目の要素を返す (配列は0から始まるため、indexは2)
if (parts.length >= 3) {
return parts[2];
} else {
return "要素数が足りません"; // エラー処理
}
}
コードの解説
ハイフンで分割: str.split('-') で文字列をハイフンで分割し、各部分を要素とする配列 parts に格納します。
3番目の要素を返す: 配列のインデックスは0から始まるため、3番目の要素 (つまり、"CC" に対応) を parts[2] で取得します。
エラー処理: 分割された要素が3つ未満の場合、エラーメッセージを返します。
使い方
カスタム関数として登録: Google スプレッドシート上で、この関数をカスタム関数として登録します。
セルに入力: =extractCCWithSplit(A1) のように、セルにこの関数を入力します。
Split 関数のメリット
シンプル: 正規表現よりも直感的に理解しやすい。
汎用性: 様々な区切り文字に対応できる。
正規表現との比較
正規表現: より複雑なパターンマッチが可能。
Split: シンプルな分割に特化している。
どちらを使うべきか
シンプルに分割したい場合: Split 関数
複雑なパターンマッチが必要な場合: 正規表現
まとめ
Split 関数は、特定の区切り文字で文字列を分割したい場合に非常に便利な関数です。今回の例のように、特定の要素を取り出すといったシンプルな処理には、正規表現よりもSplit 関数の方が適していると言えるでしょう。
補足:
エラー処理: 上記のコードでは、要素数が足りない場合のエラー処理として、"要素数が足りません" という文字列を返していますが、より適切なエラー処理を実装することも可能です。
柔軟性: 必要に応じて、分割後の配列に対して様々な処理を行うことができます。例えば、すべての要素を結合したり、特定の条件に基づいて要素を抽出したりすることができます。
このコードを参考に、ご自身のスプレッドシートに合わせた関数を作成してみてください。
とこれまた、うまくできました!!
何なら、この方がプログラムがシンプルですね。
Geminiに依頼することで、とても簡単にできました(*^^)v
うまくAIに依頼できれば、作業を効率化できるようになりますね!!
0 件のコメント:
コメントを投稿