• 締切済み

JavaScript、;がない?

Google Apps Scriptでプログラムを書きました。 すると、「ステートメントの前に;がありまあせん。(行6、ファイル「コード」)」と表示されます。 プログラムは、以下のとおりで、6行目とは、「If」文のところです。 しかし、私には、そのようなエラーが出ている理由が分からないのですが、どなかたお教えください。 function myFunction() { var s = SpreadsheetApp.GetActiveSheet(); var l = s.getMaxRows(); for (var i = 1; i < l; i = i + 1) { for (var j = 2; j <= l; j = j + 1) { If (s.getRange(i, 1).getValue == s.getRange(j, 1).getValue && s.getRange(i, 2).getValue == s.getRange(j, 2).getValue) { s.getRange(j, 1: j, 2).setBackgroundColor('aqua'); } } } }

みんなの回答

  • Kaneyan-R
  • ベストアンサー率42% (1242/2890)
回答No.6

6行目でエラーが出たと言うことは、そこにある処理(If文の処理)でエラーが出た事を意味している訳ですから、If文全体(6~8行)を疑ってかかる。 全く別の行がおかしくてエラーが出ることは、プログラムでは日常茶飯事です。

Prome_Lin
質問者

お礼

ありがとうございます。 function myFunction() { var s = SpreadsheetApp.GetActiveSheet(); var l = s.getMaxRows(); for (var i = 1; i < l; i = i + 1) { for (var j = i + 1; j <= l; j = j + 1) { If (s.getRange(i, 1).getValue == s.getRange(j, 1).getValue && s.getRange(i, 2).getValue == s.getRange(j, 2).getValue) { s.getRange(j, 1).setBackgroundColor('aqua'); s.getRange(j, 2).setBackgroundColor('aqua'); } } } } と直しましたが、やはり、同じところで同じエラーがでます。

  • asciiz
  • ベストアンサー率70% (6629/9392)
回答No.5

>「;」のエラー表示については、どうでしょうか? それについては回答No.1さんの指摘されたとおりでしょう。 回答No.2に書いたとおり、書かれたプログラムを機械側から解釈すると、「1: j」と言うパラメータ記述を取り出すことになり、これは構文エラーとなります。 そのエラーが、6行目から始まるif文付近にある、と言う指摘になったんだと思います。 指摘された行自体にエラーが無いというのは、プログラミング言語で非常によくあることです。 「6行目」と言われたら、その前後で間違っていないか見る、場合によっては数十行も離れた位置にエラーが見つかることがある。 「; が無い」と言われても、それは原因が「;」の有無では無いこともある。(ずっと前の方の「"」閉じ忘れだったり、うっかり閉じかっこを1つ忘れただけだったり) まあ、機械の方が単純バカすぎて、融通がきかないってことですから。 「わかるように書いてくんないと実行できません(泣)」と音を上げてるのがエラー表示なわけなんで、人間側が慣れて(合わせて)やんないといけません…。

Prome_Lin
質問者

お礼

ありがとうございます。 function myFunction() { var s = SpreadsheetApp.GetActiveSheet(); var l = s.getMaxRows(); for (var i = 1; i < l; i = i + 1) { for (var j = i + 1; j <= l; j = j + 1) { If (s.getRange(i, 1).getValue == s.getRange(j, 1).getValue && s.getRange(i, 2).getValue == s.getRange(j, 2).getValue) { s.getRange(j, 1).setBackgroundColor('aqua'); s.getRange(j, 2).setBackgroundColor('aqua'); } } } } と直しましたが、やはり、同じところで同じエラーがでます。

  • Kaneyan-R
  • ベストアンサー率42% (1242/2890)
回答No.4

;がないと言うことは、本当書き忘れているか、式の構文が間違っていたり、データに意図しない値が入り構文的におかしくなって、;が無視もしくは増える場合なので、パッと見書き忘れが無いようなら、構文を疑うのがセオリーです。 それで構文にも間違いがないなら、読み込まれるデータに難あり。 「:」があったことで、それ以降がラベルとして認識、結果「;が無い」になっているのでは?

Prome_Lin
質問者

お礼

プログラムを見て頂いて分かるように、「:」(コロン)は、最後の所で、範囲指定に使用していますが、エラーはその前の6行目(「if」文のところ)で出ています。 それ以外に、「:」(コロン)は、使っておりません。 質問したプログラムが、今回書いたプログラムのすべてですので、お気づきの点がありましたら、また、よろしくお願い致します。

  • Kaneyan-R
  • ベストアンサー率42% (1242/2890)
回答No.3

訂正 getRange(セル1縦,セル1横,セルの数縦,セルの数横)

Prome_Lin
質問者

お礼

ご指摘、ありがとうございます。 ただ、「;」がない、というエラー表示についての質問ですので、それに対しては、どのようにお考えでしょうか?

  • asciiz
  • ベストアンサー率70% (6629/9392)
回答No.2

ここの部分がまずいんじゃないでしょうか >s.getRange(j, 1: j, 2) たぶんあなたの考えとしては「j,1」から「j,2」の範囲指定と言うつもりでしょうけど、 言語インタプリタからその命令を解釈すると 『「j」と「1:j」と「2」の範囲(Range)!?』 というおかしなことになっている気がします。 >セル(Range)オブジェクトを取得する >http://nevernoteit1419.blogspot.jp/2012/01/range.html こちらのサンプルによると、「j,1」から「j,2」の範囲と言うのは getRange(j, 1, 1, 2) …すなわち「j,1」から1行2列、 と記述すれば良いでしょうか。

Prome_Lin
質問者

お礼

ご指摘、ありがとうございます。 「;」のエラー表示については、どうでしょうか?

  • Kaneyan-R
  • ベストアンサー率42% (1242/2890)
回答No.1

Google App Scriptは使ったことがないのでよく分かりませんが、パッと見で式の中に「:」があるのがおかしいのでは? JavaScriptでは「:」はラベルか三項演算子なので。 リファレンスサイトの解説を読むと、 ======================== objRange = objSheet.getRange("B1") //セルB1を取得 objRange = objSheet.getRange(2, 1) //セルA2を取得 objRange = objSheet.getRange(4, 3, 3) //範囲C4:C6を取得 objRange = objSheet.getRange(6, 5, 2, 4) //範囲E6:H7を取得 ======================== とあるので、範囲指定だと getRange(セル1縦,セル1横,セル2縦,セル2横) になると思う。なので、 s.getRange(j, 1: j, 2).setBackgroundColor('aqua'); ↓ s.getRange(j,1, j,2).setBackgroundColor('aqua'); っとすれば良いのかな? でもこれ、iの2巡目で同じセルを等価比較するけど良いの? i=2になったとき、jも初期値2で、 s.getRange(2,1)==s.getRange(2,1) && s.getRange(2,2)==s.getRange(2,2) になるけど・・・

Prome_Lin
質問者

お礼

ご指摘、ありがとうござます。 最初に組んだときは、「j = i + 1」としていたのですが、うっかりしていました。 それから、式の中に「:」はないと思うのですが。 どの場所でしょうか? 私は、「:」(コロン)ではなく、「;」セミコロンしか使っていないと思うのですが。 ありがとうございました。

関連するQ&A

  • google apps scriptの終了のさせ方

    google apps scripの初心者ですが、次のような関数setDatafromCurrent()の(1)でプログラムを終了するにはどうすればよいのでしょうか?  /* 転記PTデータ ピボットテーブルのデータを新しい列に貼り付けてそのまま実行してください。 カレントセルがデータの挿入列位置として使われます。 */ function setDatafromCurrent() { var SRCy = 10; var SRCx = 5; var DESTy = 7; var DESTx = 5; var DESTyLEN = 8; var mySheet = SpreadsheetApp.getActiveSheet(); var cCur = mySheet.getActiveCell(); SRCx = cCur.getColumn(); SRCy = cCur.getRow(); if (SRCx==1 && SRCy==1) { Browser.msgBox("他の人が利用している可能性があります。"); } DESTx = SRCx; var rSRC = mySheet.getRange(SRCy, SRCx, SRCy, 2); // var rSRC = mySheet.setActiveRange(cCur.offset(0, 0, SRCy, 2)); rSRC.setBackgroundColor("#dcdcff"); // rSRC.setBackgroundRGB(220,220,255); var rData = mySheet.getRange(DESTy,DESTx, DESTyLEN,1); rData.setBackgroundColor("#e6ffe6"); var ynAns = Browser.msgBox("転記しますか?",Browser.Buttons.YES_NO); if (ynAns=="no") { ・・・ (1)  ここで、プログラムを終了させたい。! } else { rData.activate(); cCur = mySheet.getActiveCell(); cCur.offset(1,0).setValue(rSRC.offset(1,1,1,1).getValue()); cCur.offset(7,0).setValue(rSRC.offset(5,1,1,1).getValue()); cCur.offset(8,0).setFormula("=SUM(R[-3]C[0]:R[-1]C[0])"); mySheet.setActiveRange(cCur.offset(0, 1, 1, 1)); } ynAns = Browser.msgBox("元のデータを消去しますか?",Browser.Buttons.YES_NO); if (ynAns=="no") { } else { rSRC.clearContent(); } rSRC.clearFormat(); rData.clearFormat(); } function 背景色の取得() { var mySheet = SpreadsheetApp.getActiveSheet(); var cCur = mySheet.getActiveCell(); cCur.setBackgroundRGB(230, 241, 210); var BG_color = cCur.getBackgroundColor(); Logger.log(BG_color); Browser.msgBox(BG_color); }

  • Google スプレッドシートのフィルタについて

    フィルタを使用し、非表示の状態にしたセルに対して[setValue(s)]を行いたいです。 しかし、日付を入力した場合、フィルタを解除すると入力ができていません。 setValue自体はログを見るとエラーは発生せず成功しています。 どうすればよろしいのでしょうか。 以下イメージです。 --------------------------------- スプレッドシート A  B  C  D No. ID 1  1 1  2 1  3 2  4 2  5 2  6 3  7 3  8 3  9 ---------------------------------- No.が1を表示するようにフィルタをかける A  B  C  D No. ID 1  1 1  2 1  3 ---------------------------------- 実行するコード IDが7の行のC列に日付、D列に[TEST]を入力 function myFunction() { var sh = SpreadsheetApp.getActive().getSheetByName( sheetname ); var id = sh.getRange("B:B").getValues(); for(var i=0; i<id.length; i++){ if(id[i] == 7){ sh.getRange("C" + (i + 1)).setValue(new Date()); sh.getRange("D" + (i + 1)).setValue("TEST"); } } } ----------------------------------- フィルタを解除 A  B  C  D No. ID 1  1 1  2 1  3 2  4 2  5 2  6 3  7    TEST 3  8 3  9

  • gasカードの変数をhtmlに反映させるには?

    スプレッドシートから引っ張ってきた情報を、htmlメールに反映させたいと考えています。 以下で書いてみたのですが、HTMIメールではmessageがそのままになってしまいます。 gasで書いた内容を反映させたいのですが、どうしたらいいのでしょうか? アドバイスお願いします。 function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('作業用'); let row = sheet.getLastRow(); //店名 let name = sheet.getRange('c' + row).getValue(); //①商品 let name5= sheet.getRange('h' + row).getValue(); //個数 let name7= sheet.getRange('j' + row).getValue(); //受信日 let name101 = sheet.getRange('a' + row).getValue(); //了解者 let name100 = sheet.getRange('w' + row).getValue(); //メール.htmlを取得 var html = HtmlService.createHtmlOutputFromFile("メール").getContent(); function doGet() { var template = HtmlService.createTemplateFromFile('メール'); template.message = "\n" +        "了解者:" + name100 + "\n" +        "商品:" + name5 + " " + name6 + " " + name7 + "個" + "\n" +        "店名:" + name + "\n" +        "本メールを了解書としてご利用ください。:" + "\n" +        "ご依頼送信日時:" + name101 + "\n"; return template.evaluate(); } var recipient = sheet.getRange('b' + row).getValue();//送信先のアドレス var subject = "了解書"; var body = '了解書' + "\n" + "\n" + "了解者:" + name100 + "\n" + "商品:" + name5 + " " + name6 + " " + name7 + "冊" + "\n" + "店名:" + name + "\n" + "\n" + "本メールを了解書としてご利用ください。:" + "\n" + "ご依頼送信日時:" + name101 + "\n"; var options = { "name": "test", //送信元の名前を指定 "htmlBody": html //メール本文をhtmlファイルに指定 }; //メール送信 if (sheet.getRange('w' + row).getValue() === '') { }else if (!sheet.getRange('x' + row).getValue() === '完了') { return false; } else {  GmailApp.sendEmail(recipient, subject, body, options);  } } <!DOCTYPE html> <html> <head> <base target="_top"> </head>  <body> <h1>了解書</h1> <p>拝啓 格別のお引立てを賜り厚くお礼申し上げます。<br> 下記の商品の返品を承ります。</p>   <h3><?=message?></h3></p>  </body> </html>

  • Googleクラウドスクリプティングでメール

    JavaScriptもGoogleApsも全くの初心者なのですが、業務で必要なため勉強し始めました。一人では行き詰ってしまいまして、どうかお力をお貸しください。 GoogleドキュメントのスプレッドシートのセルをGmailで送信しようとしています。結果は選択したセル範囲ではなく、"Sheet"という文字列がメールされてしまいます。どこがおかしいでしょうか。。 function myFunction() { var mySheet = SpreadsheetApp.getActiveSheet(); mySheet.getRange("D2:D6"); var mySubject = "件名"; var myBody = mySheet; var mailto = "メールアドレス"; GmailApp.sendEmail(mailto, mySubject, myBody ); } ※Googleクラウドスクリプティングのカテゴリがなくこちらで質問させていただきましたが、検討違いでしたら申し訳ございません。

  • JavaScriptについての質問です。

    ガウスの消去法による解の求め方をプログラムしたいのですが、上手くいかなかったので質問しました。以下のプログラムから実行はできるのですが、解が求められていませんでした。 どこを変えればきちんとできるのでしょうか、回答お願いします。 var A=[[1,-1,1],[1,2,0],[2,0,3]],b=[5,1,9]; WScript.Echo("ガウスの消去法の解:\n"+Gauss(A,b)); function Gauss(A,b) { var s,x=new Array(A.length),M=new Array(A.length); for(var i=k+1;i<A.length-1;k++) { for(var i=k+1;i<A.length;i++) { M[i]=new Array(A.length); M[i][k]=(A[i][k])/(A[k][k]); for(var j=k+1;j<A.length ;j++) A[i][j]=A[i][j]-(M[i][k]*A[k][j]); b[i]=b[i]-(M[i][k]*b[k]); } } for(var i=A.lengh-1;i>=0;i--) { s=0; for(var k=i+1;k<A.length;k++) s+=A[i][k]*x[k]; x[i]=(1/A[i][i])*(b[i]-s); } return x; }

  • GoogleAppsScriptのトリガ

    よろしくお願いします。 スプレッドシートにWEBクエリで任意のサイトから数値をコピーし、 独自計算してセル("D2:D6")に値を出しています。 これをメールグループにスクリプトトリガで毎日定時に送信したいのですが、 最初は意図通り数値が送信されるのですが、次回から #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! と出てしまいます。 自分の力量を超えておりまして、どうかお知恵をお貸しください。 function myFunction() { var mySubject = "件名"; var mySheet = SpreadsheetApp.getActiveSheet(); var myrange = mySheet.getRange("D2:D6"); var myBody = myrange.getValues(); var context = myBody.join("\n"); Logger.log(context); var myGroup = ContactsApp.getContactGroup("グループ"); var myContacts = myGroup.getContacts(); var myCount = myContacts.length; for (i = 0; i < myCount; i++) { var mailBCC = myContacts[i].getEmails()[0].getAddress(); GmailApp.sendEmail(mailBCC, mySubject, context ); } } ※Google Apps Scriptのカテゴリがなくこちらで質問させていただきましたが、検討違いでしたら申し訳ございません。

  • スプレッドシートの日付チェック

    こんにちは。 スプレッドシートのスクリプトについてお聞きします。 スプレッドシートの各行にチェックボックスと日付入力欄があります。 1番上にボタンを配置し、クリックしたらチェックしてある行の 日付を別のシートに転送したいのですが、その場合セルに入力してある内容が 有効な日付形式であるかチェックしたいのです。 入力は2018/08/30のように入力します。 for (var i=1; i<=maxgyo;i++) { var value = sheet1.getRange(i,7).getValue(); if(value==true ) { 有効な日付かチェック } この中でどのようにチェックすればよろしいでしょうか? わかる方おられましたら、宜しくお願いします。

  • javascript で undefinedと表示されます

    全ての変数、配列に alert(typeof variable); を試しましたが undefinedが見つかりません。 function a{ var lastdayArray = new Array ('','31','28','31','30','31','30','31','31','30','31','30','31'); var weekArray = new Array ('日','月','火','水','木','金','土'); var a = new Date(); var b = new Date(); var mymonth = a.getMonth()+1; var nextmonth =mymonth +1 ; var myyear = a.getYear()+1;   var today = a.getDate(); var maxbox = 36; var sday = a.setDate(1); var nday = b.setDate(1); var nmonth = b.setMonth(mymonth); var nwday = b.getDay(); var fwk = a.getDay(); var nfday = 6 - nwday; var fline = 6 - fwk; var nextlsday = lastdayArray[mymonth]; var lsbox = (fwk + lastdayArray[mymonth]) +1; var monthArray = new Array(mymonth,nextmonth); var monthflg = new Array(fwk,nfday); var nextflg = new Array(fline,nwday); var s_no0 = 1;   var s_no1 = 1; //数値代入変数       var s_no2 = 1; var s_no3 = 0; var s_no4 = 0; var s_no5 = 0; var s_no6 = 0; var s_no7 = 0; var s_no8 = 0; var schedule_no = new Array(s_no0,s_no1,s_no2,s_no3,s_no4,s_no5,s_no6,s_no7,s_no8); var s_str0 = 'a'; var s_str1 = 'a'; //文字列代入変数 var s_str2 = 'a'; var s_str3 = 'a'; var s_str4 = 'a'; var s_str5 = 'aa'; var s_str6 = 'a'; var s_str7 = 'a'; var s_str8 = 'a'; var schedule_str = new Array(s_str0,s_str1,s_str2,s_str3,s_str4,s_str5,s_str6,s_str7,s_str8); for(var x = 0; x < 2; x++){ daycount = 0; document.write(monthArray[x] + '月の予定'); if(nmonth == 12){nmonth = 0;} document.write('<table width="73%" height="337" border="1" cellpadding="1" cellspacing="1">'); //曜日出力 document.write('<tr>'); for(var l = 0 ; l <= 6; l ++){ if(l == 0){ weekArray[l] = (weekArray[l].fontcolor('#ff1493').fontsize(4)); } else if(l == 6){ weekArray[l] = (weekArray[l].fontcolor('#87ceeb').fontsize(4)); } document.write('<td>' + weekArray[l] +'</td>');} document.write('</tr>'); //曜日を判定しテーブル出力 document.write('<tr>'); //空ボックス出力 if((monthflg[x]) != 6 ){ for(var k = 0; k < (monthflg[x]); k++){ document.write('<td>' + '&nbsp;' +'</td>'); } } if((monthflg[x]) == 0){ for(var y = 0; y < 6 ; y++){ document.write('<td>' + '&nbsp;' +'</td>'); } if((schedule_no[y]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[y] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ //空ボックスの数~土曜日まで出力 for(var m =0 ; m <= nextflg[x]; m++){ if((schedule_no[m]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[m] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } } document.write('</tr>'); //行出力 for(var i =0 ; i < 4; i++){ document.write('<tr>'); //列出力 for(var j =0 ; j < 7; j++){ if(daycount < lastdayArray[monthArray[x]]){ daycount ++; document.write('<td>' + daycount +'</td>'); } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } //最終行出力 if(daycount < lastdayArray[monthArray[x]]){ document.write('<tr>'); for(var p =0 ; p < 7 ; p++){ if(daycount < lastdayArray[monthArray[x]]){ if((schedule_no[p]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[p] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } document.write('</table>'); } }

  • Google Scriptの別シートの参照

    現在、アクティブなスプレッドシートと同じシート名で、 別のスプレッドシートの同じシート名を 参照したいのですが、 getRangeで、リファレンスエラーになります。 var mySS = SpreadsheetApp.getActiveSpreadsheet(); mySS.getSheets()[j].activate(); var ss_copyFr = SpreadsheetApp.openById(GetID); var ss_copyTo = SpreadsheetApp.getActiveSpreadsheet(); var sheet_copyFr = ss_copyFr.getSheetByName(name); var sheet_copyTo = ss_copyTo.getSheetByName(name); var d = sheet_copyFr.getRange('A1').getValues();              ~~~~~~~~~~~~~~~~~~~~~~~~~~ 何か、 よい解決策は、ありますでしょうか? よろしくお願いします。

  • 素数判定プログラム

    JavaScriptで素数を出力するプログラムを書いてみました。 最大値を15万程度にすると、「IEの動作を遅くしています」というメッセージが出ます。 もう少し高速で効率が良く、最大値を多くするにはどのように改良すると良いでしょうか? 最終的に、指定した値から○個の素数を出力する と言うプログラムにしたいと思っています。 例)100から10個 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, function prime() { document.form.tbox2.value = ""; var i;var l;var count = 0; var NUM = 100000; p = new Array(NUM); for(i=0;i<NUM;i++)p[i]=1; p[0]=0; for(i=2;i<=NUM/2;i++){ for(l=2;l*i<=NUM;l++){ if(p[l*i-1] == 1) p[l*i-1] = 0; } } for(j=min;count<pie;j++){ if(p[j-1] == 1){ document.form.tbox.value += j; document.form.tbox.value += ", "; } } }

専門家に質問してみよう