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

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

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

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

Q&A

解決済

1回答

1341閲覧

Googleスプレッドシートでフィルターで表示された箇所を別シートにコピーする

mbcztpw

総合スコア30

Google Apps Script

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

0グッド

0クリップ

投稿2023/01/24 12:15

編集2023/01/31 10:32

Googleスプレッドシートでフィルターで表示された箇所を別シートにコピーしようとしています。

全件シートに全データが入力されていて、当日処理が済んだものを実施日の列に当日日付を入力し、
当日日付でフィルターします。フィルターして表示された分を処理済シートに追加する流れです。

イメージ説明
上記の全件シートを実施日でフィルターし、
イメージ説明
上記のような状態にし、上記の場合、フィルターされた13行目から16行目を下記の処理済シートに追加します。
イメージ説明

まずGASでの処理を2つに分け、
1.(全件シートで)フィルターで表示された部分の取得
2.取得した部分を(処理済シートに)貼付
のうち、1の処理は作成しました。

GAS

1function tuiki1() { 2 var ss = SpreadsheetApp.openById("XXXXX"); 3 var st1 = ss.getSheetByName('全件'); 4 var st2 = ss.getSheetByName('処理済') 5 6 //フィルター表示した部分を別シートにコピーする 7 const range = st1.getRange(3, 1, st1.getLastRow() - 2, 3); 8 const data = range.getValues().filter((v, i) => { 9 if (!st1.isRowHiddenByFilter(i + 3)) { 10 return v 11 } 12 }) 13 console.log(data) 14};

しかし、全件シートのデータの行数が数千行あり、当日日付でフィルターした当日データも数百行あるため、
上記のtuiki1の処理に10分以上かかってしまいます。

https://qiita.com/109s/items/25787fc672c03e42f866
を参考にスピードアップを図れないか試みましたが、
下図のように全件シートの一行目や項目行までコピーされてしまいます。
どのように変更すればよいでしょうか。
よろしくお願いします。

function tenki() { const ss = SpreadsheetApp.openById("XXXXX"); const zenken = ss.getSheetByName('全件'); let lastRow = zenken.getLastRow(); let lastCol = zenken.getLastColumn(); //スプレッドシートのシートをgetSheetByNameで読み込み var shorizumi = ss.getSheetByName("処理済"); //読み込んだシート名が存在するかif文で確認 if (!shorizumi) { ss.insertSheet('処理済'); shorizumi = ss.getSheetByName('処理済'); } let spreadsheetId = ss.getId(); let sheetId = zenken.getSheetId(); // フィルタしたデータを「処理済」シートにペースト let url = "https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/gviz/tq?tqx=out:csv&gid=" + sheetId + "&access_token=" + ScriptApp.getOAuthToken(); // API使用のためのOAuth認証 let res = UrlFetchApp.fetch(url); // HTTPクライアント用のクラス let array = Utilities.parseCsv(res.getContentText()); // CSVテキストを二次元配列で取得 let lastFilterdCol = array[1].length; let lastFilterdRow = array.length; console.log(lastFilterdRow) // 二次元配列arrayを処理済シートに貼り付け let lastrow = shorizumi.getLastRow(); console.log(lastrow); shorizumi.getRange(lastrow+1,1,lastFilterdRow, lastFilterdCol).setValues(array); }

tenki実行した際の処理済シート。全件シートの13行目~16行目だけでなく
見出し行も含めて処理済シートにコピーされる。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

方針としては2つあります。

  1. テキストフィルタをやめる。
  2. 参照のスクリプトのヘッダ行を削除する

今回のパターンだと日付でフィルタをかけてコピーという単純なフィルタのようなので、日付を持たせるセルを指定した上で、直接GAS側のfilterで絞ってしまえばいいと思います。

簡単な例

javascript

1const date = zenken.getRange(1, 1).getValue(); 2// 値の一致にしていますが、実際は日付としての比較が必要 3const data = range.getValues().filter(v => v === date);

投稿2023/01/24 23:16

macaron_xxx

総合スコア3191

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

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

mbcztpw

2023/01/25 02:44

ありがとうございます。考え方が分かりました。 filterの日付の指定のところでうまくいかないので再度質問致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問