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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1167閲覧

getValuesで2次元配列を取得したい

KoTT

総合スコア19

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/06/01 08:36

編集2021/06/01 09:01

GASで、ある2次元配列を別のシートにコピーしたいのですが、
下記のようにすると、値のみのペーストで、式がコピーできません。

javascript

1x = ss.getSheetByName('シート名1').getDataRange().getValues().filter(array => array[1] === 'キーワード1'); 2y = ss.getSheetByName('シート名2'); 3 4 const copySheet = function (x, y) { 5 let lastColumn = x[0].length; //列数取得 6 let lastRow = x.length; //行数取得 7 y.getRange(2, 1, lastRow, lastColumn).setValues(x); 8 }

copyToを使って書き直したところgetValueのところでエラーになります。

javascript

1x = ss.getSheetByName('シート名1').getDataRange().getValues().filter(array => array[1] === 'キーワード1'); 2y = ss.getSheetByName('シート名2'); 3 4 const copySheet = function (x, y) { 5 let lastColumn = x[0].length; 6 let lastRow = x.length; 7 8//2次元配列 x の値がうまく取得できない。 9 getValues(x).copyTo(y.getRange(2, 1, lastRow, lastColumn), SpreadsheetApp.CopyPasteType.PASTE_NO_BORDERS, false); 10 }

どのようにすれば、二次元配列を取得できるのでしょうか。。。

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

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

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

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

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

itagagaki

2021/06/01 08:46

上の let y = ... とは何ですか? それがcopySheet(x, y)のyに来るのなら、そもそもRangeオブジェクトじゃないですよね。 なぜ y.getRange ができるのですか?
KoTT

2021/06/01 08:54

すいません。 変数 x,yの記述が不適切のようです。本来の記述に近いかたちに記載しなおしました。
itagagaki

2021/06/01 09:04

xからyにコピーしたいんですよね。 でも、console.log(x); してみればわかると思いますが、xはRangeオブジェクトからgetValues()しちゃってるから、そもそも値しか持っていないのでは?
KoTT

2021/06/01 09:06

そうです! 値しかもっていない場合は、どんなメソッドつかったらいいのでしょうか。。setValues()が使えたので単純に逆のgetもいけるだろうと考えたのですが、、
itagagaki

2021/06/01 09:16

たとえば =B3+B4 というのが入っているセルは、計算結果(たとえばB3が2でB4が3なら5)がコピーされるのではなくて、そのまま =B3+B4 としてコピーしたいわけですよね? それなら xxx.copyTo(yyy) です。xxx は Rangeオブジェクトでなければなりません。
KoTT

2021/06/01 09:27

ありがとうございます。根本的に関数の作り方が悪そうですね。。この関数はコールバック関数として別の関数に使っており、変数 x をRangeオブジェクトに変える、、というのは避けたいので。そもそもの構成をイチから見直してみます。
guest

回答1

0

ベストアンサー

const copySheet以下の関数を定義したあとに、関数を実行する必要があります。

function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); let values = ss.getSheetByName('シート1').getDataRange().getValues().filter(array => array[1] === 'キーワード1'); let sheet2 = ss.getSheetByName('シート2'); const copySheet = function (ary, sheet) { let lastColumn = ary[0].length; //列数取得 let lastRow = ary.length; //行数取得 sheet.getRange(2, 1, lastRow, lastColumn).setValues(ary); } copySheet(values, sheet2); }

投稿2021/06/03 06:17

gas.engine

総合スコア608

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

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

KoTT

2021/06/04 05:33

ありがとうございます。上記参考にしながら、更に検索機能を追加してたいと思い、下記コードに書き直しました。ただ、Logger.logでは正常に動作していたのですが、スプレッドシートには反映ができません。
KoTT

2021/06/04 05:38

```javascript /** let ary1 = [['=B4+"日本のWEBサイト"', 'hoge', 'hoge'], ['=B4+"東京のWEBサイト"', 'hoge', 'hoge']]; let ary2 = [['日本', 'アメリカ', '中国'], ['東京', '神奈川', '群馬']]; */ function myfunciton() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const ary1 = ss.getSheetByName('シート1').getDataRange().getFormulas(); const ary2 = ss.getSheetByName('シート2').getDataRange().getValues(); Logger.log(ary2); /** * キー検索して&コピーペースト * @ copySource :コピー元になる2次元配列 * @ output:コピー先になる2次元配列 */ function searchAryPasteStrings(copySource, output) { for (let row in copySource) { // 配列1の行のループ for (let col in copySource[row]) { // 配列1の列のループ const cell = copySource[row][col]; for (let row2 in output) { // 配列2の行のループ for (let col2 in output[row2]) { // 配列2の列のループ const cell2 = output[row2][col2]; if (cell.indexOf(cell2) != -1) { // 一致する文字列が含まれていたらコピー output[row2][col2] = cell; } } } } } }; searchAryPasteStrings(ary1, ary2); Logger.log(ary2); } ```
gas.engine

2021/06/04 15:08

>const ary1 = ss.getSheetByName('シート1').getDataRange().getFormulas(); getFormulas()ではなくgetValues()ですよね? >function searchAryPasteStrings(copySource, output) { 引数がこのようになっていますが、 >output[row2][col2] = cell; outputの配列を変更してもいいのですか? >Logger.log(ary2); searchAryPasteStrings(ary1, ary2); この関数とは関係なく最初のary2を参照していることになります。 もう少し整理が必要と思われます。
KoTT

2021/06/05 06:55

ご指摘のとおりです。改めて見直しいたします。すいません。質問の目的とずれてきましたので、この質問は一旦ここで示させていただきます。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問