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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2731閲覧

変数内に空白があった場合の、GASでの処理に関して

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2022/12/02 02:42

実現したいこと

各シートを配列で取得した時、C列に空白の行があったら「会員番号を入力してください」と変数に代入したいです。

該当のソースコード

GAS

1// sheet 2var spreadsheet = SpreadsheetApp.getActive(); 3 4// シート取得と格納 5var sheet = spreadsheet.getSheetByName("sheet1"); 6var val = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues(); 7 8// 変数 9var name;//氏名 10var date;//会員番号 11 12// 1行ごとに処理 13for(i=1; i<val.length; i++){ 14 15 // 情報の取得 16 name = val[i][0]; 17 date = val[i][2]; 18 19 if (date.length === 0) { 20 // 空白時 21 var date1 = "会員番号を入力してください" 22 }else { 23 // デバッグ用 24 Logger.log("入力あり"); 25 } 26} 27以下略

困っていること

if (date.length === 0) の判定がうまくいってなくと思いますが
こちらで指定していなくても、nullやundefinedが代入されている事はあるでしょうか。
ある場合はどのように対応したらいいでしょうか。

または最終行の、i<val.length; i++が正常に最終行を取得できず、空白も取得してしまっているでしょうか。

原因が分からず困っていますので、ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

修正箇所

forの条件式が間違っています。
valは2次元配列なわけですから、1つ目の要素の配列は0番目から始まります。
今の質問者様のコードですと、スプレッドシートの1行目は範囲外のため何も処理せずスルーしてますね。

diff

1- for(i=1; i<val.length; i++) { 2+ for(i=0; i<val.length; i++) {

コード例

私でしたら以下のようなコードを書きます。

イメージ説明

javascript

1function getMemberInfo() { 2 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = spreadsheet.getSheetByName('Sheet3'); 4 5 // 1行目〜最終行、かつ、1列目〜最終列の範囲を取得する場合、わざわざ指定しなくても、.getDataRange()で全範囲取得できます。 6 const values = sheet.getDataRange().getValues(); 7 8 for (const arr of values) { 9 const [name, gender, memberId] = arr; // 分割代入(配列の中身を順番に一括で変数・定数に代入でする記法) 10 11 if (!memberId) { // 無記入セルは '' です。そして '' == falseです。 12 const msg = '会員番号を入力してください'; 13 Logger.log(msg); 14 } else { 15 Logger.log('入力あり'); 16 }; 17 } 18}

投稿2022/12/02 03:33

Cocode

総合スコア2314

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

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

Cocode

2022/12/02 03:42

もしかして、1行目は項目名だからあえてスルーしていたのでしょうか? (あえて i=1 から開始していた?) でしたら質問者様のコードは(提示されている部分に関しては)何も問題がありません。
退会済みユーザー

退会済みユーザー

2022/12/02 05:20

ご回答ありがとうございます。 ご回答内容で問題なくif 判定ができました。 もう1点お伺いしたいのですが、取得したシート自体に関数が入力されており その関数でもIFを使用して、FALSEの場合に空白としています。 (A列に氏名があり、B列以降はA列に入力がなかったら空白とする。という条件になっています。) この場合、空白でも関数が入力されているせいか、最終行が関数を入力している行になってしまいます。 A列に最終行を合わせる事は可能でしょうか?
Cocode

2022/12/02 05:41

その関数ご提示いただけますか?実検証してみたいです!
Cocode

2022/12/02 06:02

=IF(ISBLANK(A4)=true,,) ↑このIF関数をスプレッドシートのB4セルに記入しましたが、4行目はGASのgetDataRange()では取得されませんでした。 お試しください。
退会済みユーザー

退会済みユーザー

2022/12/02 09:00

再度のご回答ありがとうございます。 ISBLANKを使用したところ、正常な最終行が取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問