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

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

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

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

Google Apps Script

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

8831閲覧

GASにて多次元配列中の特定のデータを抽出し、複数の1次元配列にしたい

kamim

総合スコア2

Google スプレッドシート

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

Google Apps Script

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/05/21 09:57

編集2020/05/22 07:43

実現したいこと

Google Apps Scriptで、スプレッドシートでチェックボックスに
チェックを入れた項目を別シートに転記するスクリプトを書いています。
以下の結果が欲しく模索していますが、初学者ゆえ手詰まりです。
とりあえず動くコードを書きましたが欲しい結果と違います。
どのようにすればこの結果を得られるでしょうか。教えて頂ければ幸いです。

###前提
訂正しました↓
[["groupA",true,"item1",false,"item2",false,"item3"],["groupB",true,"item4",false,"item5",false,"item6"],["groupC",false,"item7",false,"item8",true,"item9"]]
訂正ここまで↑
という配列があるとします。
上記の行はそれぞれスプレッドシート上の行に相当し
groupXから最後のitemNまでの各要素が各列に相当します。

訂正しました↓
得たい結果としては

  • 頭にgroup名がきて
  • 次にチェックボックスがtrueの右隣のセルのデータ
  • trueは1行に複数あるものとします

これを別シートに改行しながら出力、つまり
groupの中からチェックをつけて選んだものだけをgroup名と共に一覧にしたいという事です。

欲しい結果

[ [ 'groupA', 'item1' ],
[ 'groupB', 'item5' ],
[ 'groupC', 'item9' ] ]

といった配列です。
この形ならforEachとappendRowで1行につき1つの配列

groupA|item1
groupB|item5
groupC|item9

と出力できることは確認しました。(|で区切られたデータは別のセルを表す)
訂正ここまで↑

trueやfalseはGoogleスプレッドシート
のチェックボックス機能を当てたセルです。
処理時間を短くしたいがためスプレッドシートのデータを
getValuesで二次元配列として取得した結果が
先頭のものです。
forEachやmap,filterなどを使えばなんとなくできるかも
いれないと思い試してみましたが初心者故うまくいきません。

###試したこと

GoogleAppsScript

1function practice() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var prasheet = ss.getSheetByName('praList'); 4 var siyousyo = ss.getSheetByName('仕様書'); 5 var lastRow = prasheet.getLastRow(); 6 var lastCol = prasheet.getLastColumn(); 7 var ar = prasheet.getSheetValues(1, 1, lastRow, lastCol); 8 var choice = ar.map(function(ar){ 9 return ar.filter(function(val,i,arr){return arr[i-1] === true}); 10 }); 11 choice = choice.flat(); 12 siyousyo.getRange("A2").setValue(choice.join(',\n')); 13 console.log(choice.join(',\n')); 14 } 15//チェックがついた右隣のセルのデータが1つのセル出力された

###利用環境
wiondows10にて
Chrome V8 を搭載した新しい Apps Script ランタイム
ブラウザ chrome バージョン: 81.0.4044.138(Official Build) (64 ビット)

初登録、初質問で色々ご指摘あるかと思いますが、
よろしくお願いいたします。

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

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

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

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

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

oikashinoa

2020/05/21 10:57

前提及び欲しい結果のJSONをソースとして本文に記載したほうが回答つきやすいですよ。
kamim

2020/05/21 23:23

ありがとうございます。まず私はJSONとは何か、から始めなければならないようです。質問の仕方として参考にします。ありがとうございました。
guest

回答1

0

ベストアンサー

こんにちは、理解が正しいかわかりませんが、下のコードでいけると思います。
filter_dataが[["groupA", "item1"],["groupB", "item5"],["groupC", "item9"]]になっていると思います。

GAS

1var ar = prasheet.getSheetValues(1, 1, lastRow, lastCol); 2var filter_data = []; 3ar.forEach(function (items) { 4 var name = items.splice(0,1)[0]; 5 items.some(function(item,i){ 6 if(item == true){ 7 filter_data.push([name,items[i+1]]); 8 return true; 9 } 10 }); 11}); 12Logger.log(filter_data);

投稿2020/05/21 15:40

fake_shibe

総合スコア806

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

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

kamim

2020/05/22 07:47

教えて頂いたコードを試すと、期待していた配列が得られました。ありがとうございました。 また、回答を頂いた後に別の方からのご指摘により質問を編集しておりその中でtrueが1行中に複数あることを新たに書きました。 頂いたコードのsomeメソッドではそれがかなわないようでしたのでmapに書き換えたところ対応できました。(何故かは理解してませんが) じっくり読み解きたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問