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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

1747閲覧

日付を検索して、ヒットしたら日付の下にコピペしたい。

GooS

総合スコア5

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2020/10/04 10:25

編集2020/10/11 03:34

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
指定した日付の下に、コピー元を貼り付けるためのGASを作っています。

マクロは経験ありますが、GASは初心者ですので人様のコードを見様見真似で作っている段階です。

発生している問題・エラーメッセージ

エラーメッセージ 参照元の日付が反映されない。

該当のソースコード

function myFunction2() { var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('サマリ'); var sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('rennsyuu'); var str = sh.getRange(2,3).getDisplayValue() //str1の日付をログに残す Logger.log("strの日付"); Logger.log(str); //コピペするシートを決める var Copy = sh.getRange(2,11,18,1).getValues() Logger.log("コピーした数値") Logger.log(Copy) var cells = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('rennsyuu').getRange(2, 2, 1, 31); var cell = getMatchRange(cells, str); if(cell === void 0){ SpreadsheetApp.getUi().alert("指定した値のセルが見つかりませんでした。"); } else { cell.offset(1,0).setValue(Copy) } } //指定した値にマッチする最初のセルを返す function getMatchRange(cells, str) { var reg = new RegExp("^" + str + "$"); //必要に応じて条件は変更 for (var col = 1; col <= cells.getNumColumns(); col++) { for (var row = 1; row <= cells.getNumRows(); row++) { var cell = cells.getCell(row, col); if (cell.getValue().match(reg)) { return cell; } } } }

試したこと

書式の問題かと思い、getValue()をgetDisplayValue()に修正しましたが解決しませんでした。
どこが間違っているのか、2日ほどかけて色々なサイトを参考にしましたが解決策が思いつかないので助けていただきたいです。

ひとつづつGASの基礎を学んでいる段階ですので、是非ご教授いただきたいです。実務で使う予定のものなので、急ぎ解決したいと思い質問しました。

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

標準的な環境だと思います。 OSも最新ですし、GoogleChromeで作業しています。 なにか特殊なAPIなどは入れていません。

イメージ説明
イメージ説明

補足として画像を添付いたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

元のコードでは、日付の文字列をそのまま正規表現に使っていますが、getValueした値は「Sun Oct 04 2020 00:00:00 GMT+0900 (日本標準時)」のような文字列なので、正規表現で特別な意味を持つ+()が含まれています。

getDisplayValueを代わりに使うというアイデアは間違っていませんが、サマリシートの日付が「10/04」と書いてあるのに対し、rennsyuuシートの日付は「10/4」と書いてあるので、正規表現でもマッチしません。

  • 日付の比較を、Utilities.formatDateで文字列化して行なう(正規表現は使わない)。
  • セルをひとつずつgetValueすると遅くなるので、getValuesしてから比較していく。
  • 値を貼り付けるときには、正確に元の大きさと同じRangeを用意して、setValuesで一気に貼り付ける。

GAS

1function myFunction2() { 2 var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('サマリ'); 3 var sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('rennsyuu'); 4 5 var str = Utilities.formatDate(sh.getRange(2, 3).getValue(), 'JST', 'yyyy/MM/dd'); 6 Logger.log("strの日付: " + str); 7 8 var copiedValues = sh.getRange(2, 11, 18, 1).getValues(); 9 Logger.log("コピーした数値: " + copiedValues); 10 11 var dateValues = sh2.getRange(2, 2, 1, 31).getValues(); 12 for (var i = 0; i < dateValues[0].length; i++) { 13 var dateStr = Utilities.formatDate(dateValues[0][i], 'JST', 'yyyy/MM/dd'); 14 if (dateStr === str) { 15 sh2.getRange(2 + 1, 2 + i, copiedValues.length, 1).setValues(copiedValues); 16 break; 17 } 18 } 19}

投稿2020/10/04 14:30

編集2020/10/04 15:00
Daregada

総合スコア11990

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

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

GooS

2020/10/05 00:21

ありがとうございます! そのまま動かしたらstring型が合わないとエラーが返ってきたんですが rennsyuuシートの日付を文字列から、日付に変更しyyyy/mm/ddにしたら希望通りの挙動になりました! 日付の比較に関してはUtilities.formatDateで文字列化した上で、比較対象のRangeを合わせることで対応するんですね! Utilities.formatDateも初めて知りましたので、この後知らなかったものは全部調べて勉強します。 この度は本当に助かりました。 ありがとうございます。
Daregada

2020/10/05 02:10

10/04と10/4(さらには2020/10/4とかも含めて)、同じ日付を示すさまざまな表記が存在しますが、それらにひとつひとつ対応するのは大変なので、「日付」の種類のデータに対して、formatDateで同じ形式の文字列にしてから比較すると楽ですね。 rennsyuuシートの日付が文字列だとformatDateの第1引数と種類が合わないので、あなたがしたように日付に変更するのが正解です。なお、表示形式はどのような形でも、比較の時に「yyyy/MM/dd」に統一されるので平気です。
GooS

2020/10/05 03:20

さらに詳しい解説ありがとうございます! GASを触ったのは初めてですが、オンライン上で自分の組んだスクリプトが動くのを見るのがこんなに楽しいとは思いませんでした! GASを使うとチャットワークやSlackといった外部サービスと連携して、いろいろな事が出来ると聞いたことがあるので、これから精進していろんな事が出来るように頑張ります! 今回は本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問