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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

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

Q&A

1回答

2112閲覧

GAS/Javascript - スプレッドシートで毎日更新される売上データを日付に対応して右の列に自動コピペしたい

rsmith

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2021/12/28 02:25

前提・実現したいこと

Google Spreadsheetにて、毎日更新されるデータを"本日の日付"に対応した右の列にコピペしたいです

以下に添付したサンプルのスプレッドシートのように、毎日午前7-8時にB列に売上データが自動更新されます
その売上データをD列以降に用意してある日付ごとの列に自動コピペしたいです
(例:1/12に取得した売上データがB列(B3:B8)に毎朝7-8時に自動的に貼り付けられますので、そのB3:B8のデータを対応する日付の列(この例だと1/12なのでF3:F8)にコピペしたいです)

https://docs.google.com/spreadsheets/d/1Pf0MGDrD7xUs7j8z7BUJ9d8trxD7_ExOzYqkt8YLuug/edit?usp=sharing

*error correctionとして、前日のデータと全く同じデータの場合はエラーとしたいです(全ての商品の売上が前日のそれと全く同じになる蓋然性がないため)(ゆえに一番最初の更新、この例だとC列は空白列として追加しています)

**A列の商品数(とそれに対応するB列の売上データの数(行))は変動せず固定です(実際は数百行分あります)

該当のソースコード

javascript

1function valueCopy() { 2 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = spreadsheet.getSheetByName("Sheet1"); 4 5 //getRangesで該当タブ、該当範囲を指定して値を取得(この例だとB3:B8) 6 //getValuesでB2の"=TODAY()"で表現された日付と2行目(B列以降)で同じ日付のセルを特定 7 //1つ左の列の3行目以下のデータ(この例だと〇3:〇8)と完全一致しないことを確認 8 //setValuesで特定した同じ日付のセルの一つ下(特定した日付の列の3行目)に値をコピペ 9}

試したこと

数週間前に初めてのGASでつまづいて、teratailで質問させていただいたところ、非常に明快な回答をいただきました
そのおかげか、この質問でさせていただいている自動化の1つ前の自動化である「売上データを毎日自動取得する」まではできました
それでGASについて少し詳しくなった、少し慣れたつもりでいましたが、今回の質問のようなシンプルなことでもつまづいてしまいましたので質問させていただきます

補足情報(FW/ツールのバージョンなど)

サンプルスプレッドシートのリンクとそのスクショをここにメモさせていただきます
https://docs.google.com/spreadsheets/d/1Pf0MGDrD7xUs7j8z7BUJ9d8trxD7_ExOzYqkt8YLuug/edit?usp=sharing
イメージ説明

宜しくお願いいたします

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/28 05:04

2行目の日付はあらかじめ一ヶ月分入っているという理解でよろしいでしょうか?
rsmith

2021/12/28 05:06

ご質問ありがとうございます はい、この自動コピペをしたい期間分、2行目に事前に日付を入力しています
papinianus

2021/12/28 10:58 編集

B3:B8 ってあるけど実際は数百行コピーするんですよね?
rsmith

2021/12/28 11:23

はい、仰る通りで実際は数百行コピーします その"数百行"というのは変動しないもので固定ですので、実際の行数に応じてソースコードを編集することで対応させていただければと思っています 例)毎日"B3:B348"の値が更新され、D列以降の"〇3:〇348"に毎日データをコピペしたいです
guest

回答1

0

B 列で最初に何も入力がない行が出現するまでの範囲をコピーします。

javascript

1const q375824 = () => { 2 const sheetName = `シート1`; 3 const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); 4 const values = sheet.getDataRange().getValues(); 5 const colBAll = values.map(([,e])=>[e]).slice(1); 6 const terminate = colBAll.findIndex(e=>e[0] === ""); 7 const colBs = terminate !== -1 ? colBAll.slice(0,terminate+1) : colBAll.slice(0); 8 const formattedDate = Utilities.formatDate(colBs[0][0],"Asia/Tokyo","M/dd"); 9 const finder = sheet.createTextFinder(formattedDate); 10 const matchedDates = finder.findAll(); 11 if(matchedDates.length !== 2) { 12 console.log("wrong calendar settings"); 13 return; 14 } 15 const targetColumn = matchedDates[1].getColumn(); 16 const colPrevious = values.map(e=>[e[targetColumn-2]]).slice(1); 17 if(isSame(colBs.slice(1),colPrevious.slice(1))) { 18 console.log("same data"); 19 return; 20 } 21 sheet.getRange(2,targetColumn,colBs.length,1).setValues(colBs); 22} 23const isSame = (a,b) => a.every((e,i)=>e[0] === b[i][0]);

投稿2021/12/28 11:35

編集2021/12/29 07:43
papinianus

総合スコア12705

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

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

rsmith

2022/01/05 07:45

お返事が遅れて申し訳ありません。早速のご回答ありがとうございました! 1点エラーが出て、解決方法を調べても解決できませんでしたのでコメントさせていただきます ご回答いただいたコードの8行目、"const formattedDate = Utilities.formatDate(colBs[0][0],"Asia/Tokyo","M/dd");" にて、以下のようなエラーメッセージが出てしまいます "TypeError: Cannot read property '0' of undefined" ↑このエラーはjavascriptではよくあるエラー?とのことですが、"colBs" の "0" がどうundefinedなのか、いろいろいじってみましたが解決方法がわかりませんでした もし可能であれば、補足でコメントしていただけると幸いです。宜しくお願いいたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問