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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1201閲覧

setValuesで一部しか表示されない!エラーが出る!

Leandro

総合スコア3

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/09/23 11:36

前提・実現したいこと

スプレッドシートの値を配列で取り出した後に、処理をした配列を

js

1オブジェクト.getRange(,,,).setValue()

を使って一括表示させたいのですが一部のみしか表示されません。
・配列は二次元配列です。

さらに以下のようなエラーも起きていて関数にミスがないかなどを確認したのですが自分では見つけられませんでした。
######エラーメッセージ

js

1Exception: データの列数が範囲の列数と一致しません。データは x 列ですが、範囲は y.列です。

・yは毎回xより2大きい数です。

コンソールを確認しても配列の処理は最後までちゃんと行われているようで、何が原因なのかがわかりません。原因が分かる方、何が原因なのか教えてください!m(_ _)m

該当のソースコード

function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const sheetData = sheet.getDataRange().getValues();  /*row関数→sortArr関数→list関数の順に処理することで配列を整理する。*/ let arr = row(sheetData); arr = sortArr(arr[0],arr[1]); arr = list(arr); console.log(arr); sheet.getDataRange().clear(); sheet.getRange(1,1,arr.length,arr[0].length).setValues(arr); } /*newArray[0]に文字列が格納され、newArray[1]に数字が格納される。*/ function row(array){ let newArray = [[],[]]; for(let col = 0;col < array[0].length/2;col++){ for(let row = 0;row < array.length;row++){ ele1 = array[row][col*2]; ele2 = array[row][col*2+1]; if(ele1 == "")continue; newArray[0].push(ele1); newArray[1].push(ele2); } } return newArray; } /*被った文字列をまとめて,被った回数を合計する。その後sortで並び替える。*/ function sortArr(arrStr,arrNum){ let newArray = [] let length = arrStr.length for(let i = 0;i < length;i++){ let first = i; let last = arrStr.lastIndexOf(arrStr[i]) while(first != last){ arrNum[first] += arrNum[last] arrStr.splice(last,1); arrNum.splice(last,1); last = arrStr.lastIndexOf(arrStr[i]) } length = arrStr.length newArray.push([arrStr[i],arrNum[i]]); } newArray.sort(function (a,b){ return b[1]-a[1]; }); return newArray; } /*25行目で改行というか次の列に移る関数。(例えばA(文字列),B(数字)のセットが25行目まで言ったら26個目はC,Dに移る、、を繰り返す。)*/ function list(array){ array.forEach(function(value,index,array){ if(newArray.length < 25)newArray.push([]) rank1 = newArray[index%25] rank1.push(value[0],value[1]) }) return newArray; }

コードの可読性が悪くて申し訳ないです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ほんとに何してるかよくわからないので、おそらく、ですが
listメソッドで列の数が一致していない配列が作成されているのではないでしょうか。

arr[n].lengthは全て一致している必要があります。

js

1arr.forEach(r => console.log(r.length));

投稿2020/09/23 23:03

macaron_xxx

総合スコア3191

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

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

Leandro

2020/09/23 23:47

arr[n].lengthは"全て"一致している必要があったんですね!知識不足でした。 arr[n].lengthをすべて同じにするための処理をlistに加えたところきれいに表示されました!本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問