3

あるシートから別のシート (同じスプレッドシート内) に (データベースのように) 「1 対多の関係」を複製しようとしています。

同様のトピックで調査を行いましたが、私をカバーする解決策はないようです。

本質的に、これは原則として次のように説明できます。

  • シート (PrimaryTable) があり、要素が pkElementID 列 (主キー) を使用して一意に (重複なしで) 格納されているとします。
  • 2 番目のシート (SecondaryTable) には、対応する ElementID に従って、各要素のプロパティが格納されます (外部キーとして機能する fkElementID 列もあります)。

これに関する補足的なメモ:

  • PrimaryTable は 2000 行以上で構成されており、SecondaryTable の範囲もほぼ同じです。
  • 前述の SecondaryTable の「プロパティ」は、実際には複数の列に分散されており、これらの列も配列数式によって 1 つの列に結合されています。
  • セカンダリ テーブルから「報告された」データは数値ではなく、結合する必要がある HTML テキストの大きな文字列 (~1000 文字以上) です。
  • 数式は配列数式である必要があります。これにより、シートに行が追加されると、できれば最初の行のヘッダー セルに自動的に入力され、ロックダウンできるようになります。

このすべての例は、セカンダリ テーブルの各行の HTML コード ( タグ) 内の要素ごとに複数の画像の URL であり、PrimaryTable の対応するセルに報告されます。

これまで、Ted Juch のブログでの議論と、次の式を使用した公開スプレッドシートへの投稿の後に解決策を見つけていました。

ArrayFormula(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('Secondary Table'!B1:B&", ");(A1:A=TRANSPOSE('Secondary Table'!A1:A)))*(LEN(A1:A)) >0))&REPT(CHAR(9)&" "&CHAR(9);TRANSPOSE(ROW('Secondary Table'!A1:A))=ROWS('Secondary Table'!A1:A)));"," &CHAR(9);0)))

上記の式は TC Adam から提案されたものだと思いますが、それがどのように機能するかは理解できているようですが、それを維持したり、別のケースに合わせて変更したりすることはほとんどできません。最後の例では、「範囲外」というエラーが返され、その理由がわかりません。

私が数式に加えた唯一の変更は、最初の配列数式内に "if (row(A1:A)=1;"Column Header"; FORMULA)" を追加することでした。

ArrayFormula(IF(ROW(A1:A)=1;"列ヘッダー"; TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE('Secondary Table'!B1:B&", ");(A1:A=TRANSPOSE('Secondary) Table'!A1:A))*(LEN(A1:A)>0))&REPT(CHAR(9)&" "&CHAR(9);TRANSPOSE(ROW('Secondary Table'!A1:A))=ROWS ('セカンダリ テーブル'!A1:A)));", "&CHAR(9);0))))

大規模なデータセットが、Google スプレッドシートの制限の下で適切に処理できないような大きな配列を生成し、それが問題の原因なのか、それとも、それを適応させようとして数式を台無しにしたのは私なのか疑問です。

また、ArrayLib.filterByText という名前の同様の関数を持つ ArrayLib ライブラリを使用してカスタム関数を作成しようとしましたが、「エラー: サービスがタイムアウトしました」というメッセージが表示されるまで、数行しか実行されません。

クエリメソッドを実装してみるべきですか? 誰でも助けることができますか?

4

1 に答える 1

0

これが私が見つけた「最良の」解決策です(クレジットはAlexander Ivanovに送られます)

1 対多の関係は正規化された方法ではなく、シリアル化された方法で保存されることに注意してください。

于 2014-08-23T09:54:31.107 に答える