🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

3611閲覧

半角カナ英数字を全角にするGASで引数に関数を使えるようにする方法

mozoushi_045

総合スコア12

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/12/29 03:36

編集2020/12/29 10:17

前提・実現したいこと

googleフォームにて半角カナ英数字指定の回答を全角に変換したいです。
そこでネットでGASコードを見つけ試しました。
ですが、引数にQUERY関数を使いたいのですが引数に関数を使えないコードのようでどのようにすればいいのかわかりません。
ご教示いただきたいです。

発生している問題・エラーメッセージ

フォーム回答の設問項目名をqueryして列の移動に耐えられるような関数を組みました。

=f7conv(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))
エラーメッセージ TypeError: string.split is not a function(行 79)が発生しました。

該当のソースコード

function myFunction() { } //全角カタカナ一覧 var zenkata = [ "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ", "ヴ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "ー", "・", "。", "、"]; //半角カタカナ一覧 var hankata = [ "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ", "ヴ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "ー", "・", "。", "、"]; //関数を作成 function f7conv(string) { //最終的に返す変数を定義 var result = ''; //変換する対象文字列をセット var input = hankata; var output = zenkata; //引数で渡された文字を分割 var text = string.split(''); //文字を再格納する配列を定義 var array = []; //分割した文字の数だけループを回し、もし濁点・半濁点だった場合は1つ前の配列の中身とセットにして array に格納 for (var i = 0; i < text.length; i++) { if (text[i] == "゙" || text[i] == "゚") { array[array.length - 1] = (text[i - 1] + text[i]); } else { array.push(text[i]); } } //再格納した文字の数だけループを回し、もし半角カナがあったら全角カナに直して result へ格納 for (var j = 0; j < array.length; j++) { var index = input.indexOf(array[j]); if (index == -1) { result = result + array[j]; } else { result = result + output[index]; } } //結果を返す return result; }

補足情報

qnoir様に頂いたコードのエラー状態になります。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/29 04:02

質問のタイトルと出ているエラーが食い違ってますが、 結局なにをどうしたいというはなしでしょうか
y_waiwai

2020/12/29 04:05

で、そもそも、 > 全角指定の正規表現がgoogleフォームではできない というのはなにをどうやってこんな結論になったんでしょうか
mozoushi_045

2020/12/29 04:34

食い違っていますでしょうか…? 無知のため質問の仕方が間違えていましたら申し訳ございません。 エラーの行79はコードの > //引数で渡された文字を分割 > var text = string.split(''); に当たるかと思うのですが、このコードを公開しているサイトに”引用に関数を渡すことはできない”とあり、これが原因なんだろうなとは思うのですが、解決方法がわかりません。 全角指定の正規表現については英数字についてはできることを実装して確認したのですが、全角カナはエラーになってしまい、様々な正規表現を探している中で2019年時点で対応していないというサイトの記事を見つけたためそう結論に至りました。
guest

回答2

0

フォーム側で回答に対して全角カナで縛りをきかせる方ですが、
回答の検証、正規表現、一致する で、

[ァ-ヴ,ー]+

ではだめですか?

投稿2020/12/29 04:52

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mozoushi_045

2020/12/29 05:09

こちらを試したのですが、エラーになってしまいます。 そのため [ァ-ヴ_-]+$ で半角カナ指定にしています。
sawa

2020/12/29 05:17

こちらでは普通に使えますね。記述式の短文タイプで検証してます。 もし「有効な正規表現を」っていうエラーがでるのであれば、なにかしら余計なものが入っているんじゃないかと。コピペで試してみてください。
guest

0

ベストアンサー

詳細が明らかにされていないので、実行環境が異なるかもしれませんが、
下記で試してみました。

(再現手順)
1.Googleスプレッドシートを新規作成する。
2.「シート2」のシート名を「フォームの回答 1」に変える。
3.「シート1」のA1セルに、該当の数式

=f7conv(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")")))

を入力
4.メニューの「ツール」→「スクリプトエディタ」で、質問中のスクリプトをコピーして保存する。

5.「フォームの回答 1」のK1セルに、適当に項目名を入力する。
6.「フォームの回答 1」のK2セルに、適当に**半角カナを含む値(たとえば「アイウエオカキクコABCD」)**を入力する。

すると、「シート1」ではA1セルが#Error表示になり、エラーセルにマウスカーソルをあてると、確かに「TypeError: string.split is not a function(行 79)が発生しました。」という表示が現れますね。


エラーメッセージより、関数に渡された引数がsplit関数を持っていない、ということではないかと推測しました。

そこで、queryが返す型を調べるため、スプレッドシート上のシート1のA2セルに試しに=TYPE(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))
と入力したところ、
「64」と表示されました。

ヘルプを見ると、64は「配列」を意味するので、query関数は配列を返すようですね、

つまりf7conv関数は、文字列ではなく配列を受け取っており、それを直接splitしようとしてるのでエラーになるのでは。

たとえば、GoogleスプレッドシートのK2セル以降に下記のように記録された場合・・・

GoogleSpread

1   [K列] 21行目 質問12 32行目 アイウエオ 43行目 カキクケコ 54行目 サシスセソ

f7conv( )関数に渡される、query('フォームの回答 ~~)という数式は、
下記のような形式の配列となります。

GAS

1[["アイウエオ"],["カキクケコ"],["サシスセソ"]]

したがって、f7conv( )関数は、この渡された配列を、全角の形式に直し

[["アイウエオ"],["カキクケコ"],["サシスセソ"]]

の形で返す関数にすればよいはずです。

具体的には下記のコードになります。

function f7conv(texts) { //最終的に返す配列を定義 var textlist = []; //配列からセル1つ1つを取り出して処理する。 for (var n in texts){ result = ''; _string = texts[n]; //変換する対象文字列をセット var input = hankata; var output = zenkata; //引数で渡された文字を分割 var text = _string[0].split(''); //文字を再格納する配列を定義 var array = []; //分割した文字の数だけループを回し、もし濁点・半濁点だった場合は1つ前の配列の中身とセットにして array に格納 for (var i = 0; i < text.length; i++) { if (text[i] == "゙" || text[i] == "゚") { array[array.length - 1] = (text[i - 1] + text[i]); } else { array.push(text[i]); } } //再格納した文字の数だけループを回し、もし半角カナがあったら全角カナに直して result へ格納 for (var j = 0; j < array.length; j++) { var index = input.indexOf(array[j]); if (index == -1) { result = result + array[j]; } else { result = result + output[index]; } } //全角変換後の文字列を配列に格納する。 textlist.push([result]) } //変換後の文字列を格納した配列を返す return textlist; }

とすればエラーはなくなると思います。

繰り返しになりますが実行する際の詳細が明らかにされておらず、実行環境が異なるかもしれないので、上記のようにコードを直したとしても質問者さんのご希望に沿う動作になるとは限らないことをご了承ください。

投稿2020/12/29 04:34

編集2020/12/29 15:23
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mozoushi_045

2020/12/29 05:35

ありがとうございます。 確かにqueryだと配列になりますね。調べ方を間違えていました… 頂いたコードで試してみます。GASの知識がない中行っているため試すのにも時間がかかってしまうと思いますので、ここでベストアンサーにさせていただきます! ありがとうございます!
退会済みユーザー

退会済みユーザー

2020/12/29 05:40

試した結果をお知らせいただきますと幸いです。
mozoushi_045

2020/12/29 08:34

> var string = strings[0][0]; //追加 に対して以下のエラーが出ました。 【TypeError: Cannot read property '0' of undefined(行 72、ファイル「コード」)】 試しに[00]や[0]にしたのですがエラー内容が変わりませんでした。
退会済みユーザー

退会済みユーザー

2020/12/29 08:55 編集

function f7conv(strings) { //引数名変更 のように関数の引数は「strings」に変えているのですよね? あと、コードも、回答に記載したそのままをコピーされているということでよろしいですよね? であるならば、上記の状態ではこちらでは正しく動いているので、残念ながらエラーを再現できず、原因もわかりません。 あとはエラーが出ている「実際の」フォームとスプレッドシートとコードを見せていただくしかないですね・・・
mozoushi_045

2020/12/29 09:05

行ったこととして、元のコードの //関数を作成 function f7conv(string) { //最終的に返す変数を定義 var result = ''; を教えていただいたコードにまるまるコピペで上書きしました。 その他の部分は元のコードから変更もしておりません。
退会済みユーザー

退会済みユーザー

2020/12/29 09:15

回答をまとめるシートのA1セルに入っている数式(「=f7conv(query('フォームの回答 1'!$A$2:$BO,"select ("&SUB~」)をいったん削除し、 エンターキーを押した後、 同じ場所(A1セル)に同じ数式を張り付け直した場合、どうでしょうか?
mozoushi_045

2020/12/29 10:19

数式側のエラーではなく、スクリプトエディターでのエラーになります。 補足にスクショを載せましたのでご確認ください。 数式側は現在空白で返されています。
退会済みユーザー

退会済みユーザー

2020/12/29 15:25

回答後半のコードを修正しました。 stringという引数名が組み込みの型名とかぶっているのが不具合の原因かもしれないと思い、textsという名前に変えています。 そのほか、アンケート回答が複数行入力されたときにも対応しました。
mozoushi_045

2021/01/08 05:47

ご連絡遅くなり大変申し訳ございません。 修正いただきましたコードにて無事に実装ができました! qnoir様のおかげで業務効率向上ができそうです! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問