Google App Script のトリガーを使って、Google Drive 上で定期バックアップ
function dump_formulas(gridID, sheetName) {
// 座標の配列を生成する関数群
var zip = function(a, b) {
return a.map(function(x,i){ return [x, b[i]]; });
};
var product = function(a, b) {
return a.map(function(x){ return b.map(function(y){ return y+x; }); });
};
var flatten = function(xs) {
return xs.reduce(function(x,y){ return x.concat(y); }, []);
};
var num_range = function(n) {
return Array(n).join(0).split(0).map(function(_,i){ return i+1; })
};
var alpha_range = function(n) {
var xs = "ZABCDEFGHIJKLMNOPQRSTUVWXY";
return num_range(n).map(function(x){
var mod = x % 26,
pow = x / 26 - (mod ? 0 : 1) | 0;
return (pow ? xs[pow] : '') + xs[mod];
});
};
// 数式を所得
var ss = SpreadsheetApp.openById(gridID),
sheet = ss.getSheetByName(sheetName),
formulas = sheet.getDataRange().getFormulas();
// 数式に座標を添え、出力形式を整える
var address = product(num_range(formulas.length), alpha_range(formulas[0].length)),
source = zip(flatten(address), flatten(formulas)) // [座標, 数式] のペアの配列を生成
.filter(function(xs){ return xs[1]; }) // 数式のないセルは無視
.map(function(xs){
return "// " + xs[0] + "\n\n" + xs[1];
}).join("\n\n====\n"); // 区切り線で連結
// 生成日時を行頭へ築城
var timestamp = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd HH:mm:ss'),
header = "// " + timestamp + "\n";
return header + source;
}
function backup_formulas() {
var content = dump_formulas("XXXXXXXX", "Sheet01");
// ファイル名
var date = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd_hhmmss'),
path = "dump_" + date + ".txt";
// Backupフォルダ内へファイル出力 ※ Backupフォルダが2つ以上ある場合は注意
var folders = DriveApp.getFoldersByName("Backup");
if (folders.hasNext()) {
folders.next().createFile(path, content);
}
}
- シートのID/シート名/ファイル・フォルダ名は適宜変更
- フォルダは予め生成しておきます
- トリガーに backup_formulas 関数を登録して、定期的な自動バックアップ
実装上の制限
- alpha_range関数を3桁に対応させてない為、列は A..ZZ までしか扱えません。