
Kikantree のディレクター鈴木です。
この記事をご覧になっている方は、同じスプレッドシートの中に毎日新しくシートを自動で作成したいと考えているのではないでしょうか?
さらには、毎日決まったテンプレートのシートをコピーできたら最高、と思ったりもしているかと思います。
さらにいうと、新たに追加したシートは対象シートの右側に追加されてしまうため、可能なら先頭に自動作成してほしいという思いもあるかもしれません。
結論からいうと、GoogleAppsScriptを使えば実現が可能です。
今回は、過去に実際にご相談をいただいて実現した時の内容を共有したいと思います。
<1> 実現したいことの整理と準備
前回と同様に、まず最初に、今回のケースで実現したいことを整理します。
今回は下記のようになると思います。
・スプレッドシートを用意する
・その中に、テンプレートとなるシートを用意し、シート名はtemp_sheetにする(このシートがコピーされる)
・毎日、決まった時刻になったら新しくテンプレートシートのコピーを自動で作成し、シート名は当日の日付(yyyyMMdd)にする
・新しく作成したシートを先頭に移動する
・古いシートを自動的に削除する
※スプレッドシートのシート数は100個が上限のため、古いシートを自動的に削除するとより便利かと思います)
今回もサンプルのスプレッドシートを用意しましたので、よろしければご利用ください。
https://docs.google.com/spreadsheets/d/1eZxu_LWVoRFrFRrp0R58Tu1BrW5_22yqWNOPU8JhcpE/edit?usp=sharing
<2> <1>で書いた流れをプログラムに書き起こしていく
あとは、流れに沿ってプログラムを書き起こしていくだけです。
最初に、実際に動くサンプルを掲載しますので、時間のない方はご自身の環境にコピペしてご利用ください。
/****************************************************************
今日の日付を取得する
****************************************************************/
var now = new Date();
// 取得した日付の型を変換する
var todayDate = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyyMMdd');
/****************************************************************
現在の時刻を取得し、
10時 → スプレッドシート内に新しいシートを作成
****************************************************************/
function judgeTime () {
var today_hour = now.getHours() //今の時刻のうち、時を取得
var today_minute = now.getMinutes() //今の時刻のうち、分を取得
/* 今が10時00分 */
if(today_hour == 10 && today_minute == 0) {
ss_sheet_copy_name()
}
/* 10時以外 */
else {
//何もしない
}
}
/****************************************************************
スプレッドシートのシートのコピーと名前変更
****************************************************************/
function ss_sheet_copy_name() {
// 現在のスプレッドシートの取得
var ss_active_all = SpreadsheetApp.getActiveSpreadsheet();
// 新しいシートの作成(templateシートのコピーを作成)
var ss_sheet_temp = ss_active_all.getSheetByName("temp_sheet"); //temp_sheetというシートがある前提のため、事前に用意しておく
var ss_sheet_copy = ss_sheet_temp.copyTo(ss_active_all);
// コピーしたシートを先頭(左端)に移動する
ss_active_all.setActiveSheet(ss_sheet_copy);
ss_active_all.moveActiveSheet(1);
// コピーしたシートの名前変更
var activeSheetName = ss_sheet_copy.setName("出荷指示" + today_MonthVal + today_DayVal); // 自由に命名
}
/****************************************************************
スプレッドシートの古いシートを削除する
****************************************************************/
function delSheetOld() {
// 現在アクティブなスプレッドシートを取得
let mySheet = SpreadsheetApp.getActiveSpreadsheet();
//取得したスプレッドシートの中で、削除したいシートの順番を指定
let delSheet = mySheet.getSheets()[5]; //順番指定。(プログラムでは1番目は0からカウントするため)先頭から数えて6番目のシートを削除する。
//deleteSheetメソッドでシート削除を実行
mySheet.deleteSheet(delSheet);
}
<3> ここに注意
コピー元となるシート(今回の例では「temp_sheet」シート)が削除対象となってしまうと、自動でコピーできなくなってしまうため、最初に削除する数以上のシートを用意しておくとスムーズに運用できると思います。
<4> GASのトリガーを設定しておく
毎日、指定の時刻に関数を実行する必要があるため、そういうときにはGASのトリガーを使用します。
デフォルトのトリガーでは、時刻の指定まではできないため、1分おきに関数を実行するトリガーを設定して時刻を判定します。
※24時間365日、毎分おきに関数を自動実行されますが、サーバー料金は基本無料です。本当にありがたいですね。
<5> まとめ
シート名をCSVのファイル名にするなど、運用上の都合や事情によって命名規則は異なると思いますが、日付であれば多くの場合にも汎用的に利用できるのではないかと思います。
また、日付別にデータを管理したり、ファイルを分けたい場合もあると思います。
こういったあたりは、実際の業務フローをヒアリングしながら最適な処理を考えて組み合わせられると、満足度の高い(欠くことのできない)仕組みを作ることができるのではないかと思っています。
とくにGASの場合はある程度のことは実現が可能であったり、直接はできないけれども代替案でカバーするということも多く実現できるため、根気よく実現に向けて組み合わせを考えることをおすすめします。
この記事がお役に立ちましたら幸いです。
https://kikantree.jp
