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

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

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

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

Q&A

解決済

2回答

3821閲覧

【GAS】翌月1カ月分の日付の入った実績入力表を作成したい。

whiteflag17

総合スコア13

Google Apps Script

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

0グッド

0クリップ

投稿2018/10/11 08:34

月末月初の作業において、最終日の入力が完了したら、翌月1カ月分の日付の入った実績入力表を作成しております。ガンチャートや勤務表のような日付が入ったものを毎月追加していくイメージです。なお、実際に作成しているものは下方向に日付がひたすら続くものです。
A~G列の7列で、日付はA列となります。

【今対応できていること】
var lastRow = sheet.getLastRow();
最終行のデータを取得。

var borderRange = sheet.getRange(lastRow +1, 1, 20, 7);
borderRange.setBorder(true, true,true,true,true,true);
罫線を付ける。(罫線の範囲は仮で設定しております)

【躓いていること】
月末の日付は毎月異なるため、末日を探して1日を指定するという記述方法が必要になるかと思いますが、JavaScriptの知識もないため、この数日間ずっと躓いております。何かよい方法をご存知の方がいらっしゃいましたら、お力添えをお願いしたく思います。何卒、宜しくお願いいたします。

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

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

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

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

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

hotta

2018/10/12 01:25 編集

前月分のシートの右側に今月分のシートを追加するという認識でよろしいですか?
whiteflag17

2018/10/12 02:23

ご返信ありがとうございます。月ごとにシートを分けるのが一般なのですが、まずは現行の業務手順を崩さず効率化を考えております。最初に投稿いただいた認識の通り、無限に縦長である1つの表となります。2018年10月31日の次の行が2018年11月1日になります。
hotta

2018/10/12 03:42

最終行のA列が 2018/10/31 とすると、その次行の A列は単に '=前行のセル+1' とし、それをずっと下に向けてコピーする、というのではいけないのでしょうか?
whiteflag17

2018/10/12 05:47

おっしゃる通りコピーで対応できる作業ではあります。ただ、対象のシートが100~150ございまして1カ月分コピーするのが手間のためGASで何とかできないものか考えております。
papinianus

2018/10/18 05:28

今さらなんですが、やりたいことは「ひとつのスプレッドシートの全シートに対して、最終行の日付の翌日から1ヶ月間の日付だけをA列に下に向かって埋めていく」で良いですか?
whiteflag17

2018/10/18 12:10

>papinianus はい。上記に記載のことが実現したいことです。
guest

回答2

0

ベストアンサー

特定シートでは動作したが、全シートでやるにはエラーハンドリングが必要だと思う。

javascript

1function fillAll() { 2 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 spreadsheet.getSheets().forEach(function(sheet) { fillDate(sheet)}); 4} 5function fillDate(sheet) { 6 const full = sheet.getDataRange().getValues(); 7 const tail = full[full.length - 1][0]; 8 const limit = tail.isEndOfMonth ? new Date(tail.getFullYear(), tail.getMonth() + 2, 0) : new Date(tail.getFullYear(), tail.getMonth() + 1, tail.getDate()); //1月29日、30日の1ヶ月後が3月に入る 9 var days = []; 10 const diff = Math.ceil((limit - tail) / 86400000); 11 for(var i = 1; i <= diff; i++) { 12 days.push([new Date(tail.getFullYear(), tail.getMonth(), tail.getDate() + i)]); 13 } 14 sheet.getRange(full.length + 1, 1, days.length, 1).setValues(days); 15} 16Date.prototype.isEndOfMonth = function(){ 17 const lastDayOfThisMonth = new Date(this.getFullYear(), this.getMonth() + 1, 0); 18 return this.getFullYear() === lastDayOfThisMonth.getFullYear() && this.getMonth() === lastDayOfThisMonth.getMonth() && this.getDate() === lastDayOfThisMonth.getDate(); 19} 20

投稿2018/10/18 05:57

papinianus

総合スコア12705

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

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

whiteflag17

2018/10/18 12:18

既存シートで反映したところ、うまく動作できました。他の方からいただいた情報とネット情報にて試行錯誤しておりましたが解決できない状態でしたので、大変助かりました。簡単な1つの動作はできるのですが、条件が複雑になるとエラーばかりが出てしまうので、いただいたコードを参考にしっかり勉強していきたいと思います。ありがとうございました。
guest

0

とりあえず、最終行の日付から翌月の1日を求めるのはこんな感じで。
後は、地道に勉強していただくしかないかと思います。

Google

1function myFunction() { 2 var ss = SpreadsheetApp.getActiveSheet(); 3 var lastRow = ss.getLastRow(); 4 var lastDate = new Date(ss.getRange(lastRow, 1).getValue()); 5 Logger.log("lastDate = " + lastDate); 6 var year = lastDate.getFullYear(); 7 var month = lastDate.getMonth(); 8 month++; 9 if (month > 12) { 10 month = 1; 11 year++; 12 } 13 var nextDate = new Date(year, month, 1); 14 Logger.log("nextDate = " + nextDate); 15} 16

投稿2018/10/12 06:33

hotta

総合スコア1613

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

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

whiteflag17

2018/10/15 00:54

hotta様、回答ありがとうございます。上記を参考に作ってみたいと思います。まずは基本が理解出来ておりませんので、これを機にしっかり勉強していきたいと思います。
macaron_xxx

2018/10/16 01:23

ちなみにですが、 if (month > 12) のブロックは必要ありませんよ。
hotta

2018/10/16 01:51

よさげにやってくれるんですね。知らなかった!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問