teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

修正

2020/12/29 15:23

投稿

退会済みユーザー
answer CHANGED
@@ -20,31 +20,85 @@
20
20
 
21
21
  --------------
22
22
 
23
- 推測すると与えられたstring変数がsplit関数を持ってないから、ということじゃないかと思いました。
23
+ エラーメッセージより関数に渡された数がsplit関数を持ってない、ということではないかと推測しました。
24
24
 
25
- そこでf7conv関数の冒頭で
26
- `Logger.log(typeof string)`
27
- を打ってログを見てみると、objectと表示されました。
28
-
29
- また、queryが返す型を調べるため、スプレッドシート上のシート1のA2セルに試しに
30
- `=TYPE(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))`
25
+ そこで、queryが返す型を調べるため、スプレッドシート上のシート1のA2セルに試しに`=TYPE(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))`
31
26
  と入力したところ、
32
27
  「64」と表示されました。
33
28
 
34
29
  ヘルプを見ると、64は「配列」を意味するので、query関数は配列を返すようですね、
35
30
 
36
- つまりf7conv関数は、文字列ではなく配列を受け取っており、それを直接splitしようとしてるのでダメんじゃないかと思いました
31
+ つまりf7conv関数は、文字列ではなく配列を受け取っており、それを直接splitしようとしてるのでエラーにるのでは
37
32
 
38
- したがって、f7conv関数で引数から文字列を取り出して処理すればいいのではないか、と思いました。。
39
33
 
34
+ たとえば、GoogleスプレッドシートのK2セル以降に下記のように記録された場合・・・
35
+ ```GoogleSpread
40
- 具体的には
36
+   [K列]
37
+ 1行目 質問12
38
+ 2行目 アイウエオ
39
+ 3行目 カキクケコ
40
+ 4行目 サシスセソ
41
41
  ```
42
+
42
- function f7conv(strings) { //引名変更
43
+ f7conv( )関数に渡される、`query('フォームの回答 ~~)`という式は、
43
- var result = '';
44
+ 下記のような形式の配列となります。
45
+
46
+ ```GAS
44
- var string = strings[0][0]; //追加
47
+ [["アイウエオ"],["カキクケコ"],["サシスセソ"]]
45
- (以下略)
46
48
  ```
47
49
 
50
+ したがって、f7conv( )関数は、この渡された配列を、全角の形式に直し
51
+ ```
52
+ [["アイウエオ"],["カキクケコ"],["サシスセソ"]]
53
+ ```
54
+ の形で返す関数にすればよいはずです。
55
+
56
+
57
+ 具体的には下記のコードになります。
58
+ ```
59
+ function f7conv(texts) {
60
+ //最終的に返す配列を定義
61
+ var textlist = [];
62
+ //配列からセル1つ1つを取り出して処理する。
63
+ for (var n in texts){
64
+ result = '';
65
+ _string = texts[n];
66
+
67
+ //変換する対象文字列をセット
68
+ var input = hankata;
69
+ var output = zenkata;
70
+
71
+ //引数で渡された文字を分割
72
+ var text = _string[0].split('');
73
+
74
+ //文字を再格納する配列を定義
75
+ var array = [];
76
+ //分割した文字の数だけループを回し、もし濁点・半濁点だった場合は1つ前の配列の中身とセットにして array に格納
77
+ for (var i = 0; i < text.length; i++) {
78
+ if (text[i] == "゙" || text[i] == "゚") {
79
+ array[array.length - 1] = (text[i - 1] + text[i]);
80
+ } else {
81
+ array.push(text[i]);
82
+ }
83
+ }
84
+
85
+ //再格納した文字の数だけループを回し、もし半角カナがあったら全角カナに直して result へ格納
86
+ for (var j = 0; j < array.length; j++) {
87
+ var index = input.indexOf(array[j]);
88
+ if (index == -1) {
89
+ result = result + array[j];
90
+ } else {
91
+ result = result + output[index];
92
+ }
93
+ }
94
+ //全角変換後の文字列を配列に格納する。
95
+ textlist.push([result])
96
+ }
97
+ //変換後の文字列を格納した配列を返す
98
+ return textlist;
99
+ }
100
+ ```
101
+
48
102
  とすればエラーはなくなると思います。
49
103
 
50
104
  繰り返しになりますが**実行する際の詳細が明らかにされておらず、実行環境が異なるかもしれないので、上記のようにコードを直したとしても質問者さんのご希望に沿う動作になるとは限らないことをご了承ください。**

6

修正

2020/12/29 15:23

投稿

退会済みユーザー
answer CHANGED
@@ -14,7 +14,7 @@
14
14
  4.メニューの「ツール」→「スクリプトエディタ」で、質問中のスクリプトをコピーして保存する。
15
15
 
16
16
  5.「フォームの回答 1」のK1セルに、適当に項目名を入力する。
17
- 6.「フォームの回答 1」のK2セルに、適当に**半角カナ値(たとえば「アイウエオカキクコABCD」)**を入力する。
17
+ 6.「フォームの回答 1」のK2セルに、適当に**半角カナを含む値(たとえば「アイウエオカキクコABCD」)**を入力する。
18
18
 
19
19
  すると、「シート1」ではA1セルが#Error表示になり、エラーセルにマウスカーソルをあてると、確かに「TypeError: string.split is not a function(行 79)が発生しました。」という表示が現れますね。
20
20
 

5

修正

2020/12/29 05:03

投稿

退会済みユーザー
answer CHANGED
@@ -14,7 +14,7 @@
14
14
  4.メニューの「ツール」→「スクリプトエディタ」で、質問中のスクリプトをコピーして保存する。
15
15
 
16
16
  5.「フォームの回答 1」のK1セルに、適当に項目名を入力する。
17
- 6.「フォームの回答 1」のK2セルに、適当に**半角カナの値(たとえば「アイウエオカキクコ」)**を入力する。
17
+ 6.「フォームの回答 1」のK2セルに、適当に**半角カナの値(たとえば「アイウエオカキクコABCD」)**を入力する。
18
18
 
19
19
  すると、「シート1」ではA1セルが#Error表示になり、エラーセルにマウスカーソルをあてると、確かに「TypeError: string.split is not a function(行 79)が発生しました。」という表示が現れますね。
20
20
 

4

修正

2020/12/29 05:02

投稿

退会済みユーザー
answer CHANGED
@@ -26,7 +26,7 @@
26
26
  `Logger.log(typeof string)`
27
27
  を打ってログを見てみると、objectと表示されました。
28
28
 
29
- また、queryが返す型を調べるため、スプレッドシート上のシート1のa1セルに試しに
29
+ また、queryが返す型を調べるため、スプレッドシート上のシート1のA2セルに試しに
30
30
  `=TYPE(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))`
31
31
  と入力したところ、
32
32
  「64」と表示されました。

3

修正

2020/12/29 04:47

投稿

退会済みユーザー
answer CHANGED
@@ -13,8 +13,8 @@
13
13
  を入力
14
14
  4.メニューの「ツール」→「スクリプトエディタ」で、質問中のスクリプトをコピーして保存する。
15
15
 
16
- 5.「フォームの回答 1」のk1セルに、適当に項目名を入力する。
16
+ 5.「フォームの回答 1」のK1セルに、適当に項目名を入力する。
17
- 6.「フォームの回答 1」のk2セルに、適当に値(たとえば「あいうえお」)を入力する。
17
+ 6.「フォームの回答 1」のK2セルに、適当に**半角カナの値(たとえば「アイウエオカキクコ」)**を入力する。
18
18
 
19
19
  すると、「シート1」ではA1セルが#Error表示になり、エラーセルにマウスカーソルをあてると、確かに「TypeError: string.split is not a function(行 79)が発生しました。」という表示が現れますね。
20
20
 

2

修正

2020/12/29 04:42

投稿

退会済みユーザー
answer CHANGED
@@ -16,7 +16,7 @@
16
16
  5.「フォームの回答 1」のk1セルに、適当に項目名を入力する。
17
17
  6.「フォームの回答 1」のk2セルに、適当に値(たとえば「あいうえお」)を入力する。
18
18
 
19
- すると、「シート1」では#Error表示になり、マウスカーソルを保存すると、「TypeError: string.split is not a function(行 79)が発生しました。」という表示が確かに現れますね。
19
+ すると、「シート1」ではA1セルが#Error表示になり、エラーセルにマウスカーソルをあてると、確かに「TypeError: string.split is not a function(行 79)が発生しました。」という表示が現れますね。
20
20
 
21
21
  --------------
22
22
 
@@ -45,4 +45,6 @@
45
45
  (以下略)
46
46
  ```
47
47
 
48
- とすればエラーはなくなると思います。
48
+ とすればエラーはなくなると思います。
49
+
50
+ 繰り返しになりますが**実行する際の詳細が明らかにされておらず、実行環境が異なるかもしれないので、上記のようにコードを直したとしても質問者さんのご希望に沿う動作になるとは限らないことをご了承ください。**

1

修正

2020/12/29 04:39

投稿

退会済みユーザー
answer CHANGED
@@ -20,25 +20,23 @@
20
20
 
21
21
  --------------
22
22
 
23
- 推測すると、
24
- string変数がsplit関数を持ってないということじゃないかと思いました。
23
+ 推測すると、与えられたstring変数がsplit関数を持ってないから、ということじゃないかと思いました。
25
24
 
26
- そこで関数の冒頭で
25
+ そこでf7conv関数の冒頭で
27
26
  `Logger.log(typeof string)`
28
27
  を打ってログを見てみると、objectと表示されました。
29
28
 
30
- また、スプレッドシート上のシート1のa1セル試しに
29
+ また、queryが返す型を調べるため、スプレッドシート上のシート1のa1セル試しに
31
30
  `=TYPE(query('フォームの回答 1'!$A$2:$BO,"select ("&SUBSTITUTE(ADDRESS(1,match(K1,'フォームの回答 1'!$A$1:$BO$1,0),4),1,)&")"))`
32
- すると、
31
+ 入力したころ
33
- 「64」と表示されま
32
+ 「64」と表示されました
34
33
 
35
- ヘルプを見ると、これは配列ので、query関数は配列を返すといことがわかりますね、
34
+ ヘルプを見ると、64配列」を意味するので、query関数は配列を返すすね、
36
35
 
37
- つまりf7conv関数は、文字列ではなく配列を受け取っているのに、それを直接splitしようとしてるのでダメなんじゃないかと思いました。
36
+ つまりf7conv関数は、文字列ではなく配列を受け取っており、それを直接splitしようとしてるのでダメなんじゃないかと思いました。
38
37
 
38
+ したがって、f7conv関数で引数から文字列を取り出して処理すればいいのではないか、と思いました。。
39
39
 
40
- したがって、f7conv関数で処理対象をstringにすればいいのではないでしょうか。・
41
-
42
40
  具体的には
43
41
  ```
44
42
  function f7conv(strings) { //引数名変更
@@ -47,4 +45,4 @@
47
45
  (以下略)
48
46
  ```
49
47
 
50
- したらエラーはなくなした
48
+ すればエラーはなくなると思い