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

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

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

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

Google Apps Script

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

Google

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

Q&A

解決済

1回答

585閲覧

Googleスプレッドシート GASについて

otaoma

総合スコア6

Google スプレッドシート

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

Google Apps Script

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

Google

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

0グッド

0クリップ

投稿2021/04/06 07:49

編集2021/04/06 08:25

前提・実現したいこと

Googleスプレッドシートを使用しており、P6が「1」より大きい場合、N6を削除するスクリプトを作成しました。
単一指定ならできたのですが、同一処理をP列とN列の全てに対して行う処理が初心者でわかりません。
ご助力お願いします。
現在入力しているコードは下記の通りです。
function test(){
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet = ss.getSheetByName("資機材準備");
var cell_P6 = sheet.getRange("P6")
var val_P6 = cell_P6.getValue()

if(val_P6>0){
var cell_N6 = sheet.getRange("N6")
cell_N6.setValue("")

}else{
}
}

発生している問題

エラーメッセージ

該当のソースコード

function test(){
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet = ss.getSheetByName("資機材準備");
var cell_P6 = sheet.getRange("P6")
var val_P6 = cell_P6.getValue()

if(val_P6>0){
var cell_N6 = sheet.getRange("N6")
cell_N6.setValue("")

}else{
}
}

試したこと

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

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

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

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

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

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

K_3578

2021/04/06 07:51

「Java」タグは本件と何の関係があるのでしょうか。 「Googleスプレッドシート」や「Google Apps Script」タグに変更して下さい。 ソースコードはMarkDownの<code>ブロック内に貼り付けてご提示ください。 ```言語名 ソースコード ``` ↑のような形です
guest

回答1

0

ベストアンサー

現時点で質問者さんが書いた処理について、1行目から最後の行まで繰り返せば良いです。
ですから、分かりやすくまとめると以下のようになります。

  1. 編集先のシートを取得します。ここは既に完成しています。
  2. 1行目のP列のセルの値を取得します。
  3. 手順2で取得した値が1以上の場合(質問者さんは「1より大きい」と書かれていますが、コードを見るに「1以上」の間違いではないでしょうか)、1行目のN列のセルの値を空にします。
  4. 手順2~3の処理を、1行目からシートの最終行までfor文で繰り返すようにします。

###1. 編集先のシートを取得する
ここに関しては既に完成しています。

JS

1var ss = SpreadsheetApp.getActiveSpreadsheet(); 2var sheet = ss.getSheetByName("資機材準備");

###2. 1行目のP列のセルの値を取得する
これも質問者さんが提示されているコードを少し変えればOKなのですが、
手順4で書き換えやすくするために、ここではgetRange関数の違う使い方を試してみましょう。

getRange関数では、getRange("P6")などとセル番号を直接文字列で指定する他に、
何行目か・何列目かをそれぞれ数値で指定する方法も提供されています。

例えば、C6のセルの値を取得したい場合は

JS

1sheet.getRange(6, 3).getValue();

となります。1つめの引数は6行目だから6、2つめの引数はA・B・Cときて3列目だから3 ということですね。

それでは、1行目のP列のセルの値を取得するにはどうすれば良いでしょう?
ご自分で書いてみて下さい。

###3. 手順2で取得した値が1より大きい場合、1行目のN列のセルの値を空にする
手順2は出来ましたか?
取得した値は変数pValueに入れておいてください。

さて、次にいきましょう。
まず「手順2で取得した値が1以上」かを判別する必要がありますが、これは単なるif文による場合分けですね。

↓答え(数字以外を入力されたら無視する機能付き)↓

JS

1if (isNaN(pValue)) { // isNaN="is Not a Number" 2 // 数字以外の場合はここへ 3} else if (pValue > 0) { 4 // 手順2で取得した値が1以上のとき、ここの処理を実行 5}

次に、「1以上」の時に限って「N列のセルの値を空に」します。
特定のセルの値を編集するのはsetValue関数です。

これについても、getRange関数は手順2で示した使い方でやってみて下さい。

さて、ここまで正しく出来ましたか?
一旦試しに実行してみて、ちゃんと動いていることが確認出来たら手順4に進んで下さい。
動かない原因が分からなくなってしまったら質問して下さい。

###4. 手順2~3の処理を、1行目からシートの最終行までfor文で繰り返すようにする
for文で行数分繰り返すことになるのですが、まずはその「シートの最終行」が何行目なのかを知る必要がありますね。
シート内の何か入力されている最終行が何行目なのかは、

JS

1var maxRow = sheet.getMaxRows();

これで取得できます。

さて、繰り返しの始まりと終わり、どちらも明らかになったのでfor文で繰り返し処理を書きましょう。
for文の書き方は大丈夫ですか?一応答えを載せておきます↓

JS

1for (var i = 1; i <= maxRow; i++) { 2 // この中の処理を繰り返す 3}

ここまで出来たら、手順2~3で書いたコードを上の答えの// この中の処理を繰り返すの部分に写します。
そして、手順2~3では「1行目」で固定していましたが、ここで「i行目」に書き換えます。
もし質問者さんがfor文にまだ慣れていないようであればここが難解かもしれません。頑張って下さい。

さあ、これでおしまいです。お疲れ様でした。

発展編…本当はこうやった方が良いです

必要なセルの値をはじめに全て取得した方が処理がはやくなりますが、2次元配列を使用することになり複雑なため、今回の回答では省略します。
ただ「必要なセルの値をはじめに全て取得した方が処理がはやくなる」ということだけは覚えておいて下さい。
少ない行数ではそこまで気になるほどにはなりませんが、getRangeやgetValueなどは使った回数だけどんどん遅くなっていきます。

その他

文末にセミコロンを付けている箇所と付けていない箇所が混在しています。どちらかに統一するとコードが綺麗になります。

余談ですが、JavaScript・GAS界隈ではセミコロンを付ける派と付けない派があったりします。因みに私は付ける派です。

付録:完全な答え

どうしても分からない時のために、最後に完全な答えも掲載しておきます。
写経しても力はほとんどつかないので丸写しだけはしないで下さい。

この答えを読んでみたものの内容が理解出来なかった場合は、是非質問して下さい。

JS

1function test(){ 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = ss.getSheetByName("資機材準備"); 4 5 var maxRow = sheet.getMaxRows(); 6 for (var i = 1; i <= maxRow; i++) { 7 var pValue = sheet.getRange(i, 16).getValue(); 8 if (isNaN(pValue)) { 9 // 数字以外の場合はここへ 10 } else if (pValue > 0) { 11 sheet.getRange(i, 14).setValue(""); 12 } 13 } 14}

投稿2021/04/06 08:57

編集2021/04/06 16:12
Automatic9045

総合スコア313

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

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

otaoma

2021/04/06 11:15

Automatic9045様、教えていただきありがとうございます! 別の方法が思い付かなかったので、もっと良い方法があるなら教えていただけないでしょうか? お手数お掛けして申し訳ございませんが、宜しくお願いいたします。
Automatic9045

2021/04/06 11:23

「発展編」の方では2次元配列が必要になりますが、大丈夫ですか? 質問者さんのレベルが分からないので、もし失礼だったらごめんなさい。
otaoma

2021/04/06 15:03

いえ、素人なので全然失礼ではないです。笑 理解できなさそうなのでやはりやめておきます。。 とりあえず現状のコードで解決させて一つ一つ学んでいきます。 因みに、教えていただいたmaxRowsを入れるだけで他は何も手直しいらないのでしょうか? 又、どこにmaxRowsをいれたらいいですか? 素人の馬鹿な質問で申し訳ありません。。。
Automatic9045

2021/04/06 15:16

やり方に関してはもう少し詳しい説明を追記しておきます。 簡単な質問でも大丈夫ですよ。 聞いて頂ければお答えしますし、質問が悪ければどこが悪いのかちゃんと説明します。 何が「悪い質問」なのかなんて、はじめの内は分からないですよね。私もそうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問