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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

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

Q&A

解決済

2回答

2565閲覧

GASのif・switch文で、2回関数を動かさないと正しい結果が出てこない

nassawa

総合スコア14

Google Apps Script

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

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

0グッド

0クリップ

投稿2020/02/14 00:36

編集2020/02/14 02:29

google Apps Scriptでif文の中にswitchの入った関数を作りました。
関数を実行してみると、1度目には間違った結果を、2回目には期待する結果を出してきます。(2回目以降はなんどやっても期待通りの結果を返してくれます)
結果の例
【case0,0になるよう入力】→ ①case3,3の結果 ②case0,0の結果
【case3,1になるよう入力】→ ①case0,0の結果 ②case3,1の結果
【case4,4になるよう入力】→ ①case3,1の結果 ②case4,4の結果
【case1,1になるよう入力】→ ①case4,4の結果 ②case1,1の結果
前回の結果が残らないよう、結果を表示するセルは毎度消して試しています。

エラーなどは出てきません。
コードでおかしいところがあるのでしょうか。

Google

1コード 2 //参照するスプレッドシートシート 3 var ss = SpreadsheetApp.openById('シートID'); 4 //参照するシート 5 var sheetA = ss.getSheetByName('sheet1'); 6 var sheetB = ss.getSheetByName('sheet2'); 7 var sheetC = ss.getSheetByName('sheet3'); 8 //参照するセル 9 var value1=sheetA.getRange("A2").getValue(); 10 var value2=sheetA.getRange("B2").getValue(); 11 var value3=sheetA.getRange("C2").getValue(); 12 13function myFunction() { 14 if ( value1 == 'A') { 15 16 switch (value2) { 17 case '0:0': 18 case '1:0': 19 case '1:1': 20 sheetB.getRange("A2").setValue(sheetC.getRange("C2").getValue()); 21 break; 22 case '2:0': 23 case '2:1': 24 case '2:2': 25 sheetB.getRange("A2").setValue(sheetC.getRange("C3").getValue()); 26 break; 27 case '3:0': 28 sheetB.getRange("A2").setValue(sheetC.getRange("C4").getValue()); 29 break; 30 case '3:1': 31 sheetB.getRange("A2").setValue(sheetC.getRange("C5").getValue()); 32 break; 33 case '3:2': 34 sheetB.getRange("A2").setValue(sheetC.getRange("C6").getValue()); 35 break; 36 case '3:3': 37 sheetB.getRange("A2").setValue(sheetC.getRange("C7").getValue()); 38 break; 39 case '3:4': 40 sheetB.getRange("A2").setValue(sheetC.getRange("C8").getValue()); 41 break; 42 case '4:3': 43 sheetB.getRange("A2").setValue(sheetC.getRange("C9").getValue()); 44 break; 45 case '4:4': 46 case '5:4': 47 sheetB.getRange("A2").setValue(sheetC.getRange("C10").getValue()); 48 break; 49 default: 50 sheetB.getRange("A2").setValue(sheetC.getRange("C11").getValue()); 51 } 52 } else { 53 switch (value2) { 54 case '0:0': 55 case '1:0': 56 case '1:1': 57 case '2:0': 58 case '2:2': 59 case '3:0': 60 sheetB.getRange("A2").setValue(sheetC.getRange("C12").getValue()); 61 break; 62 case '3:1': 63 case '3:2': 64 case '3:3': 65 case '4:3': 66 sheetB.getRange("A2").setValue(sheetC.getRange("C13").getValue()); 67 break; 68 default: 69 sheetB.getRange("A2").setValue(sheetC.getRange("C14").getValue()); 70 } 71 } 72 SpreadsheetApp.flush(); 73}

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

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

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

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

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

Lhankor_Mhy

2020/02/14 01:18

「間違った結果」と「期待する結果」をご例示ください。
nassawa

2020/02/14 01:46

結果の例 【case0,0になるよう入力】→ ①case3,3の結果 ②case0,0の結果 【case3,1になるよう入力】→ ①case0,0の結果 ②case3,1の結果 【case4,4になるよう入力】→ ①case3,1の結果 ②case4,4の結果 【case1,1になるよう入力】→ ①case4,4の結果 ②case1,1の結果 前回の結果が残らないよう、結果を表示するセルは毎度消して試しています。 今4回ほど試した時の結果です。
Lhankor_Mhy

2020/02/14 02:13 編集

実際のスプレッドシートの実行前の状態と、「間違った結果」の実行後の状態と、「期待する結果」の実行後の状態を、できればテーブルでご例示いただけますか。
nassawa

2020/02/14 02:26

すみません、そもそもテーブルがわからないです
Lhankor_Mhy

2020/02/14 02:26

では、テーブルではなくてもいいです。
guest

回答2

0

js

1function myFunction() { 2 switch (0,1){ 3 case 1,2,3,4,5,1: console.log('?'); 4 } 5}

↑上記コードは、ログに?と表示されますが、これはnassawaさんが想定している通りですか?
違うのであれば、まずそこから見直されてはいかがでしょうか?

投稿2020/02/14 02:37

編集2020/02/14 02:39
Lhankor_Mhy

総合スコア35869

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

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

dodox86

2020/02/14 02:42

>Lhankor_Mhyさん > これはdodox86さんが想定している通りですか? 回答者の私(dodox86)宛の問いかけでしたでしょうか。※私自身は、質問者さんのswitch文自体の使い方から懸念があると思っています。
Lhankor_Mhy

2020/02/14 02:48

失礼しました。お名前を間違えていました。修正しています。
dodox86

2020/02/14 03:06

承知しました。フォローとなる回答をいただきまして、どうもありがとうございます。
guest

0

ベストアンサー

setValue()で値を更新した結果が、リアルタイムにシートに反映されていないからだと思われます。
SpreadsheetApp.flush();myFunction関数の最後に実行してみてください。

SpreadsheetApp#flush() - Google Apps Script


追記しました:

SpreadsheetApp#flush()ではダメだったということで、関数外でvar ss = SpreadsheetApp.openById('シートID');...のように宣言していることからの変数のライフサイクルの問題もあるかもしれませんが、そもそものコードで、switch文のタプル(?)指定の使い方にも問題があるようです。

以下のコードでは [20-02-14 11:51:30:539 JST] 0, 1とのようにログ出力されるので、文法エラー自体は無いもののプログラマーの意図を反映していない、不正なコードだと考えられます。(Google Apps Scriptで最近使えるようになったJavaScript V8エンジンでも一応確認しましたが、同じ結果です)

GAS

1function test29() { 2 var value1 = 1; 3 var value2 = 1; 4 switch (value1, value2) { 5 case 0, 1: 6 Logger.log("0, 1"); 7 break; 8 case 1, 1: 9 Logger.log("1, 1"); 10 break; 11 default: 12 Logger.log("default"); 13 break; 14 } 15}

コメントでも書きましたが、一見正しく動いているように見えるテストパターンで試されたのだと思います。再度確認してみてください。

投稿2020/02/14 00:57

編集2020/02/14 03:02
dodox86

総合スコア9183

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

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

nassawa

2020/02/14 01:22

最後の}の手前に追加してみましたが、直らなかったです…
dodox86

2020/02/14 01:28

myFunctionをどのように呼び出しているかご提示のコードでは分かりませんが、myFunctionを1回目で呼び出した後、2回目では再度、値をvar value1=sheetA.getRange("A2").getValue(); のように正しく読み出しているのでしょうか。
nassawa

2020/02/14 01:41

myFunctionは今は都度、GASの実行を押して呼び出していました。 下記のように実行されています… [20-02-14 10:38:24:256 JST] 実行を開始しています [20-02-14 10:38:24:391 JST] SpreadsheetApp.openById([1qTz8p9g4sr0VOOPL0A9JDtLRKjTF_MXShrEQyxEAc8o]) [0.126 秒] [20-02-14 10:38:24:391 JST] SpreadsheetApp.Spreadsheet.getSheetByName([サンプル]) [0 秒] [20-02-14 10:38:24:392 JST] SpreadsheetApp.Spreadsheet.getSheetByName([吐き出し]) [0 秒] [20-02-14 10:38:24:393 JST] SpreadsheetApp.Spreadsheet.getSheetByName([データベース]) [0 秒] [20-02-14 10:38:24:394 JST] SpreadsheetApp.Sheet.getRange([A2]) [0 秒] [20-02-14 10:38:24:630 JST] SpreadsheetApp.Range.getValue() [0.235 秒] [20-02-14 10:38:24:632 JST] SpreadsheetApp.Sheet.getRange([B2]) [0 秒] [20-02-14 10:38:24:633 JST] SpreadsheetApp.Range.getValue() [0 秒] [20-02-14 10:38:24:634 JST] SpreadsheetApp.openById([1qTz8p9g4sr0VOOPL0A9JDtLRKjTF_MXShrEQyxEAc8o]) [0 秒] [20-02-14 10:38:24:634 JST] SpreadsheetApp.Spreadsheet.getSheetByName([サンプル]) [0 秒] [20-02-14 10:38:24:635 JST] SpreadsheetApp.Spreadsheet.getSheetByName([吐き出し]) [0 秒] [20-02-14 10:38:24:635 JST] SpreadsheetApp.Spreadsheet.getSheetByName([データベース]) [0 秒] [20-02-14 10:38:24:636 JST] SpreadsheetApp.Sheet.getRange([A2]) [0 秒] [20-02-14 10:38:24:636 JST] SpreadsheetApp.Range.getValue() [0 秒] [20-02-14 10:38:24:637 JST] SpreadsheetApp.Sheet.getRange([B2]) [0 秒] [20-02-14 10:38:24:637 JST] SpreadsheetApp.Range.getValue() [0 秒] [20-02-14 10:38:24:637 JST] SpreadsheetApp.Sheet.getRange([C2]) [0 秒] [20-02-14 10:38:24:637 JST] SpreadsheetApp.Range.getValue() [0 秒] [20-02-14 10:38:24:638 JST] SpreadsheetApp.Sheet.getRange([A2]) [0 秒] [20-02-14 10:38:24:639 JST] SpreadsheetApp.Sheet.getRange([C5]) [0 秒] [20-02-14 10:38:24:723 JST] SpreadsheetApp.Range.getValue() [0.084 秒] [20-02-14 10:38:24:723 JST] SpreadsheetApp.Range.setValue([Dの例文です]) [0 秒] [20-02-14 10:38:24:919 JST] SpreadsheetApp.flush() [0.195 秒] [20-02-14 10:38:25:041 JST] 実行が無事終了しました(合計ランタイム 0.283 秒)
nassawa

2020/02/14 01:45

見当違いの回答していたらすみません
dodox86

2020/02/14 01:47

//参照するスプレッドシートシート //参照するスプレッドシートシート var ss = SpreadsheetApp.openById('シートID'); //参照するシート var sheetA = ss.getSheetByName('sheet1'); ...などのコード部分は、関数になっていないということですか?
nassawa

2020/02/14 02:01

下記の部分はmyFunctionの関数の中に入れていなかったです。 //参照するスプレッドシートシート var ss = SpreadsheetApp.openById('シートID'); //参照するシート var sheetA = ss.getSheetByName('sheet1'); var sheetB = ss.getSheetByName('sheet2'); var sheetC = ss.getSheetByName('sheet3'); //参照するセル var value1=sheetA.getRange("A2").getValue(); var value2=sheetA.getRange("B2").getValue(); var value3=sheetA.getRange("C2").getValue();
dodox86

2020/02/14 02:35

そもそもですが、switch 文のタプル指定って、正しく動いていますか? できないはずなのですが。 (こちらで確認したところでは動いてません GASに最近導入されたv8ランタイムでも同じ) switch (value2,value3) { case 0,0: else 節でも、switch (value2) としている割にはcaseで0, 0: などとされています。 } else { switch (value2) { case 0,0: ... テストされているパターンで、一見、動いているように見えているだけ、と言うことはありませんか。
dodox86

2020/02/14 02:45

尚、影響は無いようですが、elseの後に全角空白文字が入っています } else<ココに入ってる>{ switch (value2) { case 0,0:
nassawa

2020/02/14 06:32

タプル指定やめて書き直したら、問題なく動くようになりました。2回目には正しく動いちゃってたので、できるものだと思ってしまいました…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問