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

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

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

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

Q&A

解決済

3回答

13366閲覧

GAS での エラー:範囲の座標、またはサイズが無効です。

damaa

総合スコア20

Google Apps Script

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

0グッド

0クリップ

投稿2018/01/10 05:12

編集2018/01/10 05:16
echo "<form action = 'xxxxx' method = 'get'>"; //この箇所① for($num=0; $num<30; $num++){ echo "<INPUT TYPE = 'text' NAME = 'name".$num."' value = '".$total[$num]."'>"; } echo "<input type = 'submit' value ='送信'>"; echo "</form>";
function doGet(e){ var id = SpreadsheetApp.getActiveSpreadsheet().getId(); var spreadSheet = SpreadsheetApp.openById(id); var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheetObj.getSheetByName("aaaa"); var fruits=[]; for(var i=0;;i++){ if(e.parameter['name'+i]===undefined) break; fruits.push(e.parameter['name'+i]); var ary = []; for (var i=0; i<fruits.length; i++) { ary.push([fruits[i]]); } //この箇所② sheet.getRange(402,2,ary.length,1).setValues(ary); }

このコードでphpからdogetして値をもらって来て、
スプレッドシートにsetValuesしようと思った時に、

//この箇所① for($num=0; $num<30; $num++){中身} //この箇所② sheet.getRange(2,2,ary.length,1).setValues(ary);

この数値や

//この箇所① for($num=0; $num<30; $num++){中身} //この箇所② sheet.getRange(10,2,ary.length,1).setValues(ary);

この数値は大丈夫なのですが、下記の数値では

//この箇所① for($num=10; $num<30; $num++){中身} //この箇所② sheet.getRange(402,2,ary.length,1).setValues(ary);
範囲の座標、またはサイズが無効です。

と出ます。

どうすれば、

//この箇所① for($num=10; $num<30; $num++){中身} //この箇所② sheet.getRange(402,2,ary.length,1).setValues(ary);

このような形でsetValuesできますでしょうか?
またセルへのsetValuesの限界値などは500程度なのでしょうか?
知識のある方ご教授下さい。

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

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

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

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

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

guest

回答3

0

ベストアンサー

下記でも動くので、500程度が限界値ということはないと思います。

function myfunction(){ var ary = [] for (var i=0;i<10000;i++){ ary.push (["あ" +i]) } var spreadsheetObj = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheetObj.getSheetByName("シート1"); sheet.getRange(1000,2,ary.length,1).setValues(ary); }

投稿2018/01/10 06:22

編集2018/01/10 06:24
jinshan

総合スコア107

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

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

damaa

2018/01/10 06:54

ご回答ありがとうございます! phpのformからget送信して、GASに送ろうとすると Bad request や、413エラーが出てきてしまい、、、 これはsetValuesの話ではなく、 データの中身が大きすぎるという ことであってますでしょうか、、、?
jinshan

2018/01/19 09:07

凡ミスで解決したのがどの部分かわからないので、回答を追加しました
guest

0

「範囲の座標、またはサイズが無効です」のエラーは、”この箇所①”で作成されるパラメータがname10name29の20件にも関わらず、”この箇所②”のaryの貼り付け範囲の行数ary.lengthが029までの30行となり、2次元配列の大きさが一致していないため出ているか、e.parametarを受け取るforループの開始値を0のままにしていて、いきなりname0===undefinedでループを抜けてしまうため、1件もデータを受け取らない=2次元配列の大きさが一致していない、というものと推測します。仮にforループの開始値を10にしても2次元配列は029(09はnull)の為、aryの貼り付け範囲の行数をary.lengthにせず、データの入っている数を指定してやる必要があります。

PHPのローカル環境がないので、疑似的に下記のようなURLを作成し実験してみました。どうやらパラメータのバイト数に上限があるようです。2104バイトまでは実行できました(Webの成功レスポンス画面表示は2097バイトまで)。ただ1バイト文字だけならもっと文字数が多くても成功画面が返ってきたりしますので、上限はよくわかりません。逆に2バイト文字がパラメータ内に多目だと上限が減ってしまうと思います。

https://script.google.com/a/ドメイン.com/macros/s/公開webアプリ固有ID/exec?name0=あ0あ&name1=い1い&name2=う2う&name3=え3え&name4=お4お&name5=か5か&name6=き6き&name7=く7く&name8=け8け&name9=こ9こ&name10=さ10さ………&name275=も275も&name276=や276や

実験に使用したコードは下記の通りです。

function doGet(e){ var id = "スプレッドシートのID"; var spreadSheet = SpreadsheetApp.openById(id); var sheet = spreadSheet.getSheetByName("シート1"); sheet.clear();//指定のシートをクリア var parameterByte=0//バイト数をカウント var fruits=[]; for(var i=0;;i++){ if(e.parameter['name'+i]===undefined){ break; } var strTmp = e.parameter['name'+i]; fruits.push(strTmp); parameterByte = parameterByte + strLenJ(strTmp) +1;//+1は&分 } var ary = []; for (var i=0;i<fruits.length;i++){ ary.push([fruits[i]]); } //この箇所② sheet.getRange(402,2,ary.length,1).setValues(ary); sheet.getRange(1,1).setValue(parameterByte); sheet.getRange(2,1).setValue(i); return HtmlService.createTemplateFromFile("ok").evaluate(); } function getRowsAndBytes(){ var id = "スプレッドシートのID"; var spreadSheet = SpreadsheetApp.openById(id); var sheet = spreadSheet.getSheetByName("シート1"); var dataCount = sheet.getRange(2,1).getValue() var parameterByte = sheet.getRange(1,1).getValue() return [dataCount,parameterByte] } // //下記サイトよりいただきました //https://qiita.com/matsuhandy/items/35133110936b3cb97345 // function strLenJ(str) {//2バイト文字は2として文字数をカウント var len = 0; str = escape(str); for (var i = 0; i < str.length; i++, len++) { if (str.charAt(i) == "%") { if (str.charAt(++i) == "u") { i += 3; len++; } i++; } } return len; }

ok.html

<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <h1>スプレッドシートの書き込み成功</h1> <? var getNumData = getRowsAndBytes(); output.append('<li>件数' + getNumData[0] + '</li>'); output.append('<li>バイト数' + getNumData[1] + '</li>'); ?> </body> </html>

投稿2018/01/19 09:08

編集2018/01/19 10:45
jinshan

総合スコア107

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

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

damaa

2018/01/19 11:20

>パラメータのバイト数に上限があるようです。2104バイトまでは実行できました(Webの成功レスポンス画面表示は2097バイトまで)。ただ1バイト文字だけならもっと文字数が多くても成功画面が返ってきたりしますので、上限はよくわかりません。逆に2バイト文字がパラメータ内に多目だと上限が減ってしまうと思います。 なるほどです! ご回答ありがとうございました! とても丁寧な説明に、テストまでしていただき、感謝です!
guest

0

自己解決しました! 凡ミスでした、、

セルへのsetValuesの限界値などは500程度なのでしょうか?

これはまだ疑問です、、、

投稿2018/01/10 05:49

編集2018/01/10 05:57
damaa

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問