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

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

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

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

Q&A

2回答

6244閲覧

GASで色のついたセルの値のみ取得する方法

mnbe

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2020/10/28 14:25

編集2020/11/02 11:06

前提・実現したいこと

以下をGASで実現したいのですが、どのように書けば良いのかご教示ください。

・シート1の黄色背景がついている値のみをシート2に出力したい。

サンプル

◆シート1
A列に日付がならんでおり、B以降の列にはその日付に応じた文字列が並んでいます。

その文字列を毎日チェックし、ある条件を満たしてるものには、手動で黄色背景をつけています。
定期的に黄色背景が増えていくイメージです。

◆シート2
シート1と同じく、A列には日付が並んでいますが、B列以降は空です。ここでにシート1の黄色背景がついている値のみを、コードが走る度に取得していきたいです。

取得先はシート1と同じ箇所が希望です。

発生している問題

初心者のため、どのように書けば上記を実現できるのかが分かりません。
シート1の背景色と値のすべてを取得することはできるのですが、黄色背景がついている値のみとなると、実現の糸口さえ見えない状況です。

説明が大雑把で申し訳ございませんが、解決方法をご教示ください。

よろしくお願いいたします。

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

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

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

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

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

Daregada

2020/10/28 14:32

「シート1」のサンプルと、「シート2」のサンプルを質問文に載せてください。 シート2の最終行に、シート1の黄色背景が付いている値を、どういう形で追加すればいいのか、あなたにしかわかっていません。 シート1の対象となる範囲や、そこに含まれる(黄色背景の)複数の値をどんな順番でシート2に書いていくのかがはっきりしないと、コードが書けません。
mnbe

2020/10/28 14:57

ありがとうございます。 修正してみましたが、他に必要な情報があればお知らせ下さい。よろしくお願いいたします。
guest

回答2

0

javascript

1const q300982 = () => { 2 const colour = "#ffffff"; // 何を黄色と言っているか、色コードはこちらでは分かりません。 3 const sourceSheetName = "シート1"; 4 const targetSheetName = "シート2"; 5 const book = SpreadsheetApp.getActive(); 6 7 const sourceRange = book.getSheetByName(sourceSheetName).getDataRange(); 8 const rowsToPick = sourceRange.getBackgrounds().reduce((a,c,i) => c[1] === colour ? [...a,i] : a,[]); 9 const updates = new Map(sourceRange.getValues().filter((e,i)=> rowsToPick.includes(i)).map(e=> [Utilities.formatDate(e[0], "JST", "yyyy/MM/dd"),e[1]])); 10 11 const targetSheet = book.getSheetByName(targetSheetName); 12 const vals = targetSheet.getDataRange().getValues().map(e=>updates.get(Utilities.formatDate(e[0], "JST", "yyyy/MM/dd")) === undefined ? [e[1]] : [updates.get(Utilities.formatDate(e[0], "JST", "yyyy/MM/dd"))]); 13 targetSheet.getRange(1,2,vals.length,1).setValues(vals); 14}
  • 動作未確認

  • シート1では同じ日は重複して出現しない前提

  • こういう場合には C 列にチェックしたというデータを持たせるといいと思います。そして、色は条件書式でつける。もともと(人間が見て)便利にするために色をつけていたはずなのに、その色は作業効率化に効果的でなく結果として便利でない状況です。

投稿2020/11/20 17:27

編集2020/11/20 17:30
papinianus

総合スコア12705

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

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

0

方針だけ。

おなじRangeに対するgetValues()getBackgrounds()で取得される配列の添字が同じであれば必ず同じセルを示します。
片方の配列で色のチェックを行い、同じ添字で値を取得すれば、色付きのセルのみ値を取得することが可能です。

以下、サンプルです。
(A列の日付などは一切考慮せず、シート1の黄色背景のみをまるっとシート2にうつすスクリプトです。)

js

1function q300982() { 2 const targetColor = '#ffff00'; 3 4 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 5 const sheet1 = spreadSheet.getSheetByName('シート1'); 6 const sheet2 = spreadSheet.getSheetByName('シート2'); 7 8 const sheet1DataRange = sheet1.getDataRange() 9 const sheet1Data = sheet1DataRange.getValues(); 10 const sheet1Color = sheet1DataRange.getBackgrounds(); 11 12 const newSheet2Data = sheet1Data.map((row, rowNum) => { 13 return row.map((val, colNum) => { 14 return sheet1Color[rowNum][colNum] === targetColor ? val : ''; 15 }); 16 }); 17 18 sheet2.getRange(1, 1, newSheet2Data.length, newSheet2Data[0].length).setValues(newSheet2Data); 19}

投稿2020/11/03 23:49

macaron_xxx

総合スコア3191

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問