バックグラウンド
Googleは、2021年6月1日よりデータ保持ポリシーを変更します。つまり、ドキュメントと写真が本格的になり、合計15GBの割り当てで考慮されるようになります。また、アカウントが2年以上使用されていない場合、Googleはお客様のデータを削除する場合があります。
私はGoogleドキュメントを頻繁に使用していますが、頻繁に使用すると、ディスクの割り当てがすぐになくなります。しかし、良いニュースがあります。2021年6月1日より前に作成されたドキュメントは、無重力のままなので、一晩でクォータ違反が発生することはありません。
私はすぐにドキュメントを「在庫あり」にすることを思いつきました。以下では、多くの時間と労力を費やすことなくこれを行う方法を説明します。
ドキュメントを作成するスクリプトを書く
Google AppsScriptを使用してスクリプトを作成します。
新しいGoogleスプレッドシートを作成し、スクリプトエディタに移動します([ツール] -[スクリプトエディタ])。
3つのファイルを作成します
main.gs-ファイルを作成するためのメインコード
menu.gs-テーブルを開くときにカスタムメニューを作成するコード
index.html -
function onOpen(e) { //
SpreadsheetApp.getUi() //
.createMenu('') //
.addItem(' ', 'main') //
.addToUi(); //
}
main.gs main(), .
function main() { // -
// HTML
let template = HtmlService.createTemplateFromFile(`index`);
// HTML
SpreadsheetApp.getUi()
.showModelessDialog(template.evaluate(),` ...`);
}
index.html. HTML , . , ..
index.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script>
let timer = function(){ //
//
let now = (new Date()).getTime();
// - 1
setInterval(function(){
// . now - .
let time = (new Date()).getTime() - now;
//
let minutes = Math.floor(time/60000);
//
let seconds = Math.floor(time%60000/1000);
// lifeTime
updateData("lifeTime", `${minutes<10?"0"+minutes:minutes}:${seconds<10?"0"+seconds:seconds}`);
},1000);
};
updateData = function(id, value){ // id
let element = document.getElementById(id);
if (element) {
element.innerHTML = value;
};
};
refreshData = function(){ //
google.script.run.withSuccessHandler(function(data){
updateData("createTables", data.createTables); // :
updateData("createDocs", data.createDocs); // :
updateData("createForms", data.createForms); //
updateData("createSlides", data.createSlides); //
updateData("log", data.log); //
}).getData(); //
};
setTimeout(setInterval(refreshData, 2000),1000); // 2
timer(); //
google.script.run.doMagic(); //
</script>
</head>
<body>
<div class=".container bg-dark text-white text-center">
<div class="row">
<div class="col">
</div>
<div class="col">
</div>
<div class="col">
</div>
<div class="col">
</div>
</div>
<div class="row">
<div class="col" id="createTables">
0
</div>
<div class="col" id="createDocs">
0
</div>
<div class="col" id="createForms">
0
</div>
<div class="col" id="createSlides">
0
</div>
</div>
</div>
<div class=".container bg-dark text-white">
<div class="row">
<div class="col text-right" id="label_lifeTime">
:
</div>
<div class="col text-left" id="lifeTime">
00:00
</div>
</div>
</div>
<div bg-dark text-white id="label_log">: </div>
<ul class="list-group" id="log">
</ul>
</body>
</html>
, , :
updateData(id, value) - id
refreshData() - ,
timer() -
main.gs .
function create()
const FILES_TO_CREATE = 50;
function create(filesToCreate = FILES_TO_CREATE, folderId, prefix="file_", app, key) {
// - .
let props = PropertiesService.getScriptProperties();
// data.
let data = JSON.parse(props.getProperty(`data`));
try{
// id
let folder = DriveApp.getFolderById(folderId);
for(var i=0; i<filesToCreate; i++){ // filesToCreate
// , id
let ssId = app.create(`${prefix}${(new Date()).getTime()}`).getId();
// id
let ss = DriveApp.getFileById(ssId);
//
folder.addFile(ss);
//
DriveApp.getRootFolder().removeFile(ss);
//
data[key]=1+data[key];
//
props.setProperty(`data`, JSON.stringify(data));
};
}catch(err){
// -
logToHtml(`Error: ${err}`, LOG_TYPES.danger);
};
//
return +i;
};
- , , .
create()
function createSheets(key) {
// id
let folderId = PropertiesService.getScriptProperties().getProperty(`sheetsFolder`);
//
let count = create(FILES_TO_CREATE, folderId, `sheet_`, SpreadsheetApp, key);
//
logToHtml(`${count} sheets were created`, LOG_TYPES.success);
}
function createDocs(key) {
let folderId = PropertiesService.getScriptProperties().getProperty(`docsFolder`);
let count = create(FILES_TO_CREATE, folderId, `doc_`, DocumentApp, key);
logToHtml(`${count} docs were created`, LOG_TYPES.success);
}
function createForms(key) {
let folderId = PropertiesService.getScriptProperties().getProperty(`formsFolder`);
let count = create(FILES_TO_CREATE, folderId, `form_`, FormApp, key);
logToHtml(`${count} forms were created`, LOG_TYPES.success);
}
function createSlides(key) {
let folderId = PropertiesService.getScriptProperties().getProperty(`slidesFolder`);
let count = create(FILES_TO_CREATE, folderId, `slide_`, SlidesApp, key);
logToHtml(`${count} slides were created`, LOG_TYPES.success);
}
.
function createFolders(){
// -
let props = PropertiesService.getScriptProperties();
//
let folders = [
{key:`rootFolder`, name:`` },
{key:`sheetsFolder`, name:`Sheets`, parentFolder:`rootFolder`},
{key:`docsFolder`, name:`Docs`, parentFolder:`rootFolder`},
{key:`formsFolder`, name:`Forms`, parentFolder:`rootFolder`},
{key:`slidesFolder`, name:`Slides`, parentFolder:`rootFolder`},
];
//
folders.forEach(folder=>{
if (!props.getProperty(folder.key)){ //
// rootFolder, ,
let parentFolder = folder.parentFolder?DriveApp.getFolderById(props.getProperty(folder.parentFolder)):DriveApp.getRootFolder();
//
let folderId = parentFolder.createFolder(folder.name).getId();
//
props.setProperty(folder.key, folderId);
};
});
}
:
,
function doMagic(){
let props = PropertiesService.getScriptProperties();
//
let data = {
createTables:0,
createDocs:0,
createForms:0,
createSlides:0,
startTime:new Date(),
log:``,
};
//
props.setProperty(`data`, JSON.stringify(data));
try{
createFolders(); //
createSheets(`createTables`); //
createDocs(`createDocs`); //
createForms(`createForms`); //
createSlides(`createSlides`); //
// ,
SpreadsheetApp.getUi().alert(`!`);
}catch(err){
//
SpreadsheetApp.getUi().alert(`! ${err}`);
};
};
- .
function getData(){ //
// -
let props = PropertiesService.getScriptProperties();
//
let data = JSON.parse(props.getProperty(`data`));
return data; //
};
:
const LOG_TYPES = { // . bootstrap
primary: "primary",
secondary: "secondary",
success: "success",
danger: "danger",
warning: "warning",
info: "info",
};
function logToHtml(log, type = LOG_TYPES.primary){
//
let data = getData();
// li ( )
data.log+=`<li class="list-group-item text-${type}">${log}</li>\n`;
//
let props = PropertiesService.getScriptProperties();
props.setProperty(`data`, JSON.stringify(data));
};
. Google - . , .
6 . . , HTML API,
. Exception: : docs create.
TL;DR
上記のすべてをテーブルにまとめて、自分自身にコピーし([ファイル]-コピーを作成)、実行して([メニュー]-[ファイルを作成])、ディスクに数百のファイルを取得します。必要に応じて手順を繰り返します。
ご清聴ありがとうございました。コードに関するフィードバックをいただければ幸いです。がんばろう!