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

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

ただいまの
回答率

88.34%

gas 二次元配列結合

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 447

gomagoma00

score 2

gasで二次元配列の中にある配列に結合したいです。
[[a,b,c],[c,d,f,g],[h,i]]と二次元配列があり[j,k,l]を追加し[[a,b,c],[c,d,f,g,j,k,l],[h,i]]のような形にしたいです。

concatやpushを使ってもエラーが起きたり欲しい結果が得られませんでした。

function compare(data) {
 let newarray = []
  for(var i=1; i < 5000 ; i++){
    if(data[i][15] !== "ok")
    newarray.push(data[i])
    for(var j=2; j < 5001 ; j++){
      if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){
        if (data[i][12] === data[j][12] ) {
        newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);
     data[j].push("ok") 
   }
  }
 }
}
 return newarray
}

const result = compare(data)
sheet_output.getRange(1,1,4053,45).setValues(result);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • draq

    2020/09/24 18:27

    concatやpushをどう使ったのでしょうか?

    キャンセル

回答 2

checkベストアンサー

+2

質問者様提示のコード(t()として再現)をエラーなく実行するために squarize が必要なので、実装しました。
(sample data やその他のコードを補わなければ回答不能です。未知のものをこちらが妄想するほど望ましい回答からは離れますし、その的外れな空想のために不必要な誰も嬉しくない時間がかかることをどうかご理解いただきたいです)

→ なので、squarize だけ持っていけば実行可能だと思います。多分。

ところが実行したところ、下にサンプル出力を出しましたが、欲しいかたちとして私には全く理解不能でした。
(出力が多すぎて(右に長くなりすぎて)10000字を越え、別回答にすら貼ることができませんでした。サンプルデータとコードをかいているので、実行と再現が可能なはずなので割愛しました)

得ようとしている結果はデータ構造としておすすめできない形式ですが、すくなくとも一定程度の整合性をもたせるには、q293827() 程度の一貫的な結果が必要なのではないでしょうか。
いちおう sample では末尾列に a があるかないかで不揃いにしています。もし元データがもっと不揃いなのだとしたら、q293827() だと空白が間にはさまってしまって不適切だと思いますが、右に展開した列が各列で不揃いであるほうがより良くないと考えて再構成しました。

本来やりたかったことに立ち返って、元データから見直すことをご提案いたします。ご検討いただければと思います。

const notOk = (data) => {
    const isNotOk = {"col":15,"val":"ok"};
    return data.filter(e=>e[isNotOk.col] !== isNotOk.val);
};
const buildDicForSingle = (data) => {
    const isSingle = {"col":1,"val":"SinglePhrase"};
    const wordCol = 12;
    return new Map(data.reduce((a,c,i)=>c[isSingle.col] === isSingle.val ? a.concat([[c[wordCol],i]]):a,[]));
}
const merge = (data,map) => {
    const wordCol = 12;
    return data.reduce((a,c,i)=>{ Logger.log(a);return map.has(c[wordCol]) ? ((map.get(c[wordCol]) !== i) ? a : a.concat([data.filter(e=>e[wordCol] === c[wordCol]).flat()])) : a.concat([c])},[]);
}
const squarize = (jag) => {
    const maxLen = Math.max(...jag.map(e=>e.length));
    const empties = Array(maxLen).fill("");
    return jag.map(e=> e.concat(empties).slice(0,maxLen));
}
const q293827 = () => {
    const book = SpreadsheetApp.getActive();
    const data = book.getActiveSheet().getDataRange().getValues();
    const notok = notOk(data);
    const dic = buildDicForSingle(notok);
    const res = merge(notok,dic);
    const format = squarize(res);
    if(format.length < 1) return;
    book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
}

function compare(data) {
    let newarray = []
    for(var i=1; i < 5000 ; i++){
        if(data[i][15] !== "ok")
            newarray.push(data[i])
        for(var j=2; j < 5001 ; j++){
            if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){
                if (data[i][12] === data[j][12] ) {
                    newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);
                    data[j].push("ok")
                }
            }
        }
    }
    return newarray
}
function t() {
    const book = SpreadsheetApp.getActive();
    const data = book.getActiveSheet().getDataRange().getValues();
    const format = squarize(result);
    book.getSheetByName("1").getRange(1, 1, format.length, format[0].length).setValues(format);
}


-- sample data

 A   B              C   D   E   F   G   H   I   J   K   L   M    N   O   P    Q 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   1    3   4   5      
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   5    a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   30   3   4   5      
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   5    a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   30   3   4   5      
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   5    a 
     a              2   3   4   5   6   7   8   9   0   1   40   3   4   5      
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   40   3   4   5    a 
     a              2   3   4   5   6   7   8   9   0   1   9    3   4   5      
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   10   3   4   5    a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   1    3   4   ok     
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   ok   a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   30   3   4   ok     
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   ok   a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   30   3   4   ok     
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   20   3   4   ok   a 
     a              2   3   4   5   6   7   8   9   0   1   40   3   4   ok     
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   40   3   4   ok   a 
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   9    3   4   ok     
     SinglePhrase   2   3   4   5   6   7   8   9   0   1   10   3   4   ok   a 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/25 22:23

    すみません、教えてもらっている立場で大変申し訳ないのですがいつ頃コードは書き終わりそうでしょうか?

    キャンセル

  • 2020/09/26 18:02

    わざわざありがとうございます。
    一度データを見直して新しい方法を検討してみようと思います。

    キャンセル

  • 2020/09/26 18:14

    while分を使って空白を追加しようと試みているのですがうまく機能しないのでもしよろしければご教授ください。
    新しい質問を投稿しました。

    キャンセル

0

const array = [[a,b,c],[c,d,f,g],[h,i]];
const result = array[1].push(j,k,l);

でどうでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る