質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1355閲覧

【GAS】配列内の空欄の要素に指定した文字列を入力したい

moro_05

総合スコア4

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2023/01/18 03:42

前提

GASでフォームできた回答の内容を抽出して別のシートに転記するスクリプトを作成しています。

実現したいこと

特定の列に空欄があった場合に、"入力なし"と表示させたいです。

特定の列(一列)を二次元配列で取得し、その配列の中に空欄があった場合、
空欄の要素内に"入力なし"と入れ、その配列をシートに転記させたいです。

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

Logger.logの列に下記のエラーが出ます。 Arrayflat.indexof is not a function

該当のソースコード

//二次元配列を取得 var Array=Sheet.getRange(2,33,Sheet.getLastRow()-1,1).getValues(); //二次元配列を一次元配列にする var Arrayflat=Array.flat for(var f=0;f<Array.length;f++){ if(Arrayflat.indexOf("")){     Array.push("入力なし")}; Logger,log(Arrayflat.indexof("")); }

試したこと

.pushは配列の末尾に入れるものなのはわかっておりますが、
「空欄の場合に指定の値を入れる」といった書き方がわかりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

そのスクリプトはどのタイミングで実行させるものなのでしょうか?
詳細が分かりませんので、 「フォームが送信された時に、その回答を転記する」 コードをご紹介します。

手順

  1. フォームの回答がスプシに自動で出力されるように、フォーム側で設定しておく。
  2. スプシのコンテナバインド型のGASを作成する。
  3. 下記コードを書く。
  4. 3.で書いた関数をトリガーに設定する(フォーム送信時)

コード例

javascript

1function transcribeFormResponses(e) { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = ss.getSheetByName('Sheet2'); // 転記先のシートを取得 4 5 const values = e.values.map(v => v || '入力なし'); // 送信された回答内容の書き換え 6 // ['1/20/2023 1:16:09', '質問1の回答', '', '質問3の回答'] ←これを 7 // ['1/20/2023 1:16:09', '質問1の回答', '入力なし', '質問3の回答'] ←これに書き換える 8 9 sheet.appendRow(values); // 転記先シートの最終行に値を追加 10}

解説

↓フォーム画面
イメージ説明

↓フォームの回答が自動で出力されるシート
イメージ説明

↓フォームの回答の回答のない部分を「入力なし」に変換して転記されたシート
イメージ説明

フォームを送信すると関数transcribeFormResponses(e)に設定した引数e(イベントオブジェクト)から、フォームの送信情報が取得できます。
取得できるオブジェクトは下記の通りです。

引数e(イベントオブジェクト)で取得できる情報

javascript

1{ 2 "authMode": "FULL", 3 "namedValues": { 4 "質問3": ["質問3の回答"], 5 "質問2": [""], 6 "Timestamp": ["1/20/2023 1:16:09"], 7 "質問1": ["質問1の回答"] 8 }, 9 "range": { 10 "columnEnd": 4, 11 "columnStart": 1, 12 "rowEnd": 2, 13 "rowStart": 2 14 }, 15 "source": {}, 16 "triggerUid": "99999999", 17 "values": ["1/20/2023 1:16:09", "質問1の回答", "", "質問3の回答"] // ←この一次元配列(e.values)を利用する 18}

e.valuesで取得できる一次元配列で、値が空白""の場合、「入力なし」という文字列を代わりに入れ込んでやるように、.map()で行います。
そしてそのまま、転記先のシートに行追加で値をいれてやるといいです。

投稿2023/01/19 16:37

Cocode

総合スコア2314

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

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

0

ベストアンサー

GAS

1for (let i = 0; i < Arrayflat.length; i++) { 2 if (Arrayflat[i] == "") { 3 Array.push("入力なし") 4 }; 5 console.log(Arrayflat); 6}

こんな感じでやりたいことと、知りたいことがわかるかなと。
いかがでしょうか。

たぶん、こうしたいんだと思います

GAS

1//二次元配列を取得 2var Array=Sheet.getRange(2,33,Sheet.getLastRow()-1,1).getValues(); 3//二次元配列を一次元配列にする 4var Arrayflat=Array.flat 5 6for (let i = 0; i < Arrayflat.length; i++) { 7 if (Arrayflat[i] == "") { 8 Arrayflat[i] = "入力なし"; 9 }; 10 console.log(Arrayflat); 11} 12

投稿2023/01/18 04:26

編集2023/01/18 05:15
penguin520

総合スコア345

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

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

YAmaGNZ

2023/01/18 04:42

質問のコードからそうなっているのですが for文のArray.lengthはArrayflat.lengthかと また空白を置き換えたいのですからArrayにpushするのも違うのではないですか?
moro_05

2023/01/18 04:50 編集

penguin520様 回答ありがとうございます。 教えていただいた内容でやってみましたが、エラーは出ないもののArrayflatは変わらず、Arrayは配列の末尾に"入力なし"が空白セル分追加された形になりました。 if(Arrayflat[f] == ""){ Arrayflat.push("入力なし") }; Logger.log(Arrayflat); にしてみても空欄には入らず、末尾に入力なしが空白セルの数だけ入ってしまいます。
penguin520

2023/01/18 04:51

if(Arrayflat[f] == ""){ Arrayflat[f] = "入力なし"; }; Logger.log(Arrayflat); これで、実現したいことはできると思いますが。おそらく、型の概念とかが無いので理解できないのだと思います。 わたしは、GASでたまにお仕事をさせていただいていて、GASを使う人が増えてシェアが広がればうれしい限りなのですが、GASは初等者でもチャレンジできることから、プログラミングの基礎が無いまま始められるかたが多いのをなんとかしたいなと思ってます。 宜しくお願いします。
penguin520

2023/01/18 04:54

>for文のArray.lengthはArrayflat.lengthかと 見落としてました。すいません。
YAmaGNZ

2023/01/18 05:04

最終的にシートへの転記をするのであれば、1次元配列に変換せずに2次元配列のまま行ってもいいのではないかと思います。 getRange(2,33,Sheet.getLastRow()-1,1) と必ず1行しかとってこないという保証がないコードになっていますし
moro_05

2023/01/20 09:57

if(Arrayflat[f] == ""){ Arrayflat[f] = "入力なし"; }; Logger.log(Arrayflat); こちらで解決しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問