※ 注意!本章節是針對個人用途使用。並且是第一次練習使用 Google Apps Script,內有有諸多潦草不成熟的寫法,僅供參考。若有更好的方式歡迎留言交流,感謝。
//整組連貫動作
function go(excel_id){
//var copy_sheet_is = 0;
//從 備用(無人更新時請自行取用) 複製 Sheet(來源與目標相同 Excel)
copy_sheet_new(excel_id,excel_id,"備用(無人更新時請自行取用)");
//從舊有 Sheet 透過 Replace Regex 分析萃取出 年月日,並推算日期進位,下回規則設定產生新日期後,產生新的 Sheet 名稱
//之後把上面複製出來的 Copy of 備用(無人更新時請自行取用) 改成新名稱
//但這塊也是最容易出 Bug 的地方
sheet_copy_name(excel_id,"Copy of 備用(無人更新時請自行取用)");
//Debug 用(非必要):只有在會多產生出異物才做刪除
//刪除程序多產生的 Copy of 備用(無人更新時請自行取用)
// del_sheet(excel_id,"Copy of 備用(無人更新時請自行取用)");
//觀察最後結果用
var ss = open_excel(excel_id);
var sheet = ss.getSheets()[0];
Logger.log("最後第一個[0]Sheet是:"+sheet.getSheetName()); //sheet.showSheet();
}
//for A檔 Excel
function _for_a(){
go("0Avb1e3AASsaLdDM2UkliWTBhM29uaGg1ZlpRdFQmc");
}
//for B檔 Excel
function _for_b(){
go("0Avb1e3AASsaLdGpEeGkxcVhvS1pMYjkzNQY3U1ZWc");
};
//讀取 Excel ok
function open_excel(excel_id){
//Source set
//參考://https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app
var ss = SpreadsheetApp.openById(excel_id);
//Logger.log(ss.getName());
return ss;
}
//Sheet 重新命名 ok
//https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#copy(String)
function sheet_rename(excel_id,sheet_target_name,sheet_new_name){
var ss = open_excel(excel_id);
var target_sheet = ss.getSheetByName(sheet_target_name);
var target_new_name_test = ss.getSheetByName(sheet_new_name); //防止發生新命名與原有項目重複
if((target_sheet!=null)&&(target_new_name_test==null)){
Logger.log(target_sheet.getSheetName());
target_sheet.setName(sheet_new_name);
}
}
//刪除指定 Sheet (ByName) ok
function del_sheet(excel_id,sheet_name){
var ss = open_excel(excel_id);
var sheet = ss.getSheetByName(sheet_name);
if(sheet!=null){
ss.deleteSheet(sheet);
}
}
//Sheet 顯示 (ByName) ok
function show_sheet(excel_id,sheet_target_name){
var ss = open_excel(excel_id);
//var sheet = ss.getSheets()[0];
var sheet = ss.getSheetByName(sheet_target_name);
Logger.log(sheet.getSheetName());
sheet.showSheet();
}
//Sheet 隱藏 (ByName) ok
function hide_sheet(excel_id,sheet_target_name){
var ss = open_excel(excel_id);
//var sheet = ss.getSheets()[0];
var sheet = ss.getSheetByName(sheet_target_name);
Logger.log(sheet.getSheetName());
sheet.hideSheet();
}
//根據指定 Sheet 複製 Sheet 到指定檔案(有防止複製已經複製過的項目)
function copy_sheet_new(source_excel_id,target_excel_id,sheet_name){
var ss = open_excel(source_excel_id);
//set target sheet by .getSheet 參考:https://developers.google.com/apps-script/reference/spreadsheet/sheet#copyTo(Spreadsheet)
//var sheet = ss.getSheets()[0];
var target_sheet = ss.getSheetByName(sheet_name);
var target_sheet_have = ss.getSheetByName("Copy of " + sheet_name);
if((target_sheet!=null)&&(target_sheet_have==null)){
Logger.log(target_sheet.getSheetName());
var destination = open_excel(target_excel_id); //目標 Excel 檔案
target_sheet.copyTo(destination); //將來源檔案中指定的 Sheet 複製到目標 Excel 檔案裡面(會出現在最前面)
//debug: 莫名其妙會複製了次的時候,讓他自動刪掉多複製的
var sheet_1st_now = ss.getSheets()[0];
var sheet_1st_now_name = sheet_1st_now.getSheetName();
if (sheet_1st_now_name == "Copy of " + sheet_name + " 1"){
//sheet_1st_now.clear();
del_sheet(target_excel_id,"Copy of " + sheet_name + " 1");
}
/*
if (sheet_1st_now_name == "Copy of 備用(無人更新時請自行取用) 1"){
//sheet_1st_now.clear();
del_sheet(target_excel_id,"Copy of 備用(無人更新時請自行取用) 1");
}
*/
}else{
Logger.log("沒有找到指定 Sheet 或是複製過了");
}
}
//主要動作內容:根據非範例的已存在紀錄Sheet的名稱,取得格式並推導下次日期。之後為新複製的更名為下次日期。
function sheet_copy_name(excel_id,sheet_target_name){
var ss = open_excel(excel_id);
//get_last_title(excel_id,主要排除的sheet name)
var last_title = get_last_title(excel_id,sheet_target_name);
Logger.log("取得的分析來源標題為:"+last_title);
//用來解決 抓錯名格式參考 Sheet:排除範例與其複製的可能性的第一順位Sheet應該就是最新的參考日期
//var sheet = ss.getSheets()[2];//var sheet = ss.getSheets()[2];
var sheet = ss.getSheetByName(last_title);
if(sheet!=null){
Logger.log("上次日期:::::::::::::::::::::::::::" + sheet.getSheetName());
//取出上次紀錄標題中的日間紀錄
var last_play_day = sheet.getSheetName();
//假設推移觀察(預先測是可能的意外狀況):
//last_play_day = "";
//利用 Regex Replace 刪除法把不要的部分選取起來 "" 取代
var last_day = last_play_day.replace(/.{0,20}/,"");
var last_day = parseInt(last_day.replace(/.{0,7}$/,""));
var last_month = last_play_day.replace(/.{0,17}/,"");
var last_month = parseInt(last_month.replace(/.{0,10}$/,""));
var last_year = last_play_day.replace(/.{0,12}/,"");
var last_year = parseInt(last_year.replace(/.{0,13}$/,""));
var last_week_name = last_play_day.replace(/.{0,23}/,"");
var last_week_name = last_week_name.replace(/.{0,5}$/,"");
//目前開放規則,只開週二、四、六(另外順便日數在週六的時候改成+3)
switch(last_week_name) {
case "二":
var new_week_name = "四";
var next_day = last_day + 2;
break;
case "四":
var new_week_name = "六";
var next_day = last_day + 2;
break;
case "六":
var new_week_name = "二";
var next_day = last_day + 3;
break;
default:
//
}
//為了日期進位所以設定各月總天數
switch(last_month) {
case 1:
var last_month_day = 31;
break;
case 2:
var last_month_day = 28;
break;
case 3:
var last_month_day = 31;
break;
case 4:
var last_month_day = 30;
break;
case 5:
var last_month_day = 31;
break;
case 6:
var last_month_day = 30;
break;
case 7:
var last_month_day = 31;
break;
case 8:
var last_month_day = 31;
break;
case 9:
var last_month_day = 30;
break;
case 10:
var last_month_day = 31;
break;
case 11:
var last_month_day = 30;
break;
case 12:
var last_month_day = 31;
break;
default:
//
}
//處理日期進位
if(next_day>last_month_day){
next_day = next_day - last_month_day;//next_day = next_day - 30;
last_month = last_month + 1;
if(last_month>12){
last_month = last_month -12;
last_year = last_year + 1;
}
}
//補零(同時變回字串)
if(next_day < 10){
next_day = "0" + next_day;
}
//補零(同時變回字串)
if(last_month < 10){
last_month = "0" + last_month;
}
var next_time = last_play_day.replace(/\d............/,last_year + "." + last_month + "." + next_day + "(" + new_week_name + ")");
Logger.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + next_time);
sheet_rename(excel_id,sheet_target_name,next_time);
//隱藏舊有 Sheet
hide_sheet(excel_id,last_title);
}
}
//觀察 sheet_copy_name 並 Debug:目前是要排除取用到的舊資料不是紀錄資料。也就是要排除 Copy of 備用(無人更新時請自行取用)以及 備用(無人更新時請自行取用
//目前為 sheet_copy_name 裡面提供來源參考標題 last_title
function get_last_title(excel_id,sheet_target_name){
var ss = open_excel(excel_id);
var sheet_test = ss.getSheets()[0];
var sheet_test_name = sheet_test.getSheetName();
//sheet_test_name = sheet_test_name.replace("Copy of ","");//這一定會有BUG,例如早就存在0與1位置上分別為 A 跟 copy A ,經過這一道不管是哪個當目標進來都會被當 A,不過因為下面觀察的時候又會手動加回 Copy 所以這個 BUG 又抵銷了,最終目的還是有達到同判斷出A 與 copy A 最後要排除這兩項。
sheet_test_name = sheet_test_name.replace(/.*)/,""); // 利用 (無人更新時請自行取用) 的全形下括號特徵 透過 Regex 把有含有這個項目的全都特徵統一話並抓出來,跳過他
var sheet_test1 = ss.getSheets()[1];
var sheet_test1_name = sheet_test1.getSheetName();
sheet_test1_name = sheet_test1_name.replace(/.*)/,"");
var sheet_test2 = ss.getSheets()[2];
var sheet_test2_name = sheet_test2.getSheetName();
sheet_test2_name = sheet_test2_name.replace(/.*)/,"");
var sheet_test3 = ss.getSheets()[3];
var sheet_test3_name = sheet_test3.getSheetName();
sheet_test3_name = sheet_test3_name.replace(/.*)/,"");
//var last_day = last_play_day.replace("Copy of ","");
//sheet_test.getSheetName()!="Copy of " + sheet_target_name 沒有意義。因為進來的本來就要做 "Copy of 備用(無人更新時請自行取用)"
//所以要增加排除的其實是 Regex Copy of 之後的
/*
if((sheet_test.getSheetName()!=sheet_target_name)&&(sheet_test.getSheetName()!="Copy of " + sheet_test_name)){
Logger.log("[0]:" + sheet_test.getSheetName());
}
if((sheet_test1.getSheetName()!=sheet_target_name)&&(sheet_test1.getSheetName()!="Copy of " + sheet_test1_name)){
Logger.log("[1]:" + sheet_test1.getSheetName());
}
if((sheet_test2.getSheetName()!=sheet_target_name)&&(sheet_test2.getSheetName()!="Copy of " + sheet_test2_name)){
Logger.log("[2]:" + sheet_test2.getSheetName());
}
*/
if (sheet_test_name==""){
Logger.log("排除0");
if (sheet_test1_name==""){
Logger.log("排除1");
if (sheet_test2_name==""){
Logger.log("排除2");
if (sheet_test3_name==""){
Logger.log("排除3");
}else{
Logger.log("3:" + sheet_test3.getSheetName());
return sheet_test3.getSheetName();
}
}else{
Logger.log("2:" + sheet_test2.getSheetName());
return sheet_test2.getSheetName();
}
}else{
Logger.log("1:" + sheet_test1.getSheetName());
return sheet_test1.getSheetName();
}
}else{
Logger.log("0:" + sheet_test.getSheetName());
return sheet_test.getSheetName();
}
//這支 Function 的目標是:retrun 一個排除過的參考名稱 String 回去給重點核心的 var sheet 當成 ByName 的目標(也是可以By序號但回傳就要回傳數字代號)
}
//沒有目標的舊版本
//還沒寫成 ByName 的 Sheet copy
//改良版在重點項目 function copy_sheet_new
function copy_sheet(source_excel_id,target_excel_id){
//Source set 參考://https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app
var ss = SpreadsheetApp.openById(source_excel_id);
Logger.log(ss.getName());
//set target sheet by .getSheet 參考:https://developers.google.com/apps-script/reference/spreadsheet/sheet#copyTo(Spreadsheet)
var sheet = ss.getSheets()[0];
var destination = SpreadsheetApp.openById(target_excel_id); //目標 Excel 檔案
sheet.copyTo(destination); //將來源檔案中指定的 Sheet 複製到目標 Excel 檔案裡面(會出現在最前面)
}
//基礎測試
function test(){
//copy_sheet("0AiiCzROFD-FrdEJQblRJVkN6RmpKeWU5ZUpWbnFyUlE","0AiiCzROFD-FrdEJQblRJVkN6RmpKeWU5ZUpWbnFyUlE");
//hide_sheet("0AiiCzROFD-FrdEJQblRJVkN6RmpKeWU5ZUpWbnFyUlE");
//show_sheet("0AiiCzROFD-FrdEJQblRJVkN6RmpKeWU5ZUpWbnFyUlE");
//sheet_rename("0AiiCzROFD-FrdEJQblRJVkN6RmpKeWU5ZUpWbnFyUlE","A 的副本","0");
}
//get_last_title(excel_id,主要排除的sheet name)
// var last_title = get_last_title("0AiiCzROFD-FrdGhmSy1LbmpLQXJQSk9kUW8zZmRRN0E","Copy of 備用(無人更新時請自行取用)");
// Logger.log("取得的分析來源標題為:"+last_title);
//測試重複、連續產生四次 go()
/*
function gogo(){
go();go();go();go();
};
*/