GASでスプレッドシートからGoogleドライブにフォルダを自動作成する方法をくわしく解説しました。
GASはGoogleのサービス上で使えるスクリプトでスプシやGメールの自動化をするのにめちゃ便利で重宝しています。事務処理時間をグッと短縮できます!
JavaScriptが理解できればわりとカンタンですが、JSが苦手な方でもコピペで使えるよう、サンプルコードもあります。
2021年6月検証済み!
かみーゆ/フロントエンドエンジニア
私はプロジェクトの管理をするとき、こんな感じでGoogleドライブに同じ構造でフォルダを作ってます。
案件/
├ プロジェクトA/
│ ├ 議事録/
│ ├ 受領物/
│ └ 納品物/
├ プロジェクトB/
│ ・・・
└ プロジェクトC/
・・・
毎回同じ処理するのってすげーめんどくさい!!
プロジェクト名の接頭辞は連番にしたいし、自動化したいと思った結果…
そうだ!Google Apps Script(GAS)があるじゃないか!!
- スプシにプロジェクト登録
- 個々の連番のプロジェクトフォルダ自動生成
- さらにその下に、書くプロジェクトごとに仕分けたいフォルダを自動生成
- ドライブのリンクをスプシに記録
上記をGASなら自動で登録できる。
これワンクリックでできたら、「仕事が楽(ラク)になる」んじゃないか?!
そう信じて作ったGASコードをご紹介します。
Googleドライブにプロジェクトを格納する親フォルダ作成
プロジェクト格納用のフォルダをprojectという名前で作成します。
フォルダ作成時に発行されたURLの~folders/
以下になります。
https://drive.google.com/drive/u/0/folders/【ID】
プロジェクト登録用のスプシを作ろう!
スプレッドシートでプロジェクト管理用のシートを用意します。
今回はこんな構成にしました。
セルB1に「project(親)フォルダのID」を入力しておきます。
スプシは100行、D列まで表示し、シート名をprojectとしておきました。
スプシにはチェックボックスを設置できる
スプシにはチェックボックスを設置できるので先に設置しておきます。設置したいところにデータの入力規則をセット。
条件でチェックボックスを選択して、無効なデータの場合入力を拒否にチェックを入れておきます。
スプシにチェックボックスが実装できました!!
値
- チェック時…TRUE
- チェックなし…FALSE
A列に一個チェックボックスができたら100行までコピペします。
IDの連番を振る
C列にプロジェクト名が明記されたら、IDが振られる仕組みにします。
B列に以下コードを貼り付けます。
if(C3<>"",text(counta($B$2:B2),"000"),"")
text関数でゼロパディング(0埋め)表示します。
text([数字],"000")
今回3ケタにしましたがお好みのケタにしてください。
プロジェクトを追加したら、IDを追加できます。
触って欲しくない場所はシートを保護しておく
チームで管理する場合はデータをうっかり変更されてしまわないよう、データの保護で編集できないようにします。
管理者権限を1アカウントとかにしてしまうといいです。
この場合はA列とC列以外は保護してしまいます。
フォルダの自動生成処理
スクリプトエディタでフォルダを自動生成するコードを書きます。
新規で立ち上げたApps Scriptページはこちら。
「無題のプロジェクト」で作られるので、管理しやすい名前に書き換えておきます。今回は「プロジェクト管理」としました。
関数名もデフォルトでmyFunction
になっているのでcreateProject
に書き換えます。
function createProject() {
}
シートのデータ取得
シート内のデータを取得します。B列の最後の列を参照し、最後の行を取得します。
// 省略
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('project');
const last = sheet.getRange(2, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
// 省略
取得したいデータの2行目から、連続してデータのあるセルの最後の列番号を取得できます。
sheet.getRange(2, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
親フォルダの取得
親フォルダ(project)を取得します。getFolders
でさらにその直下のフォルダも取得し、フォルダ名を配列childrenList
に格納しておきます。
// 省略
const parentFolderId = sheet.getRange('B1').getValue();
const parentFolder = DriveApp.getFolderById(parentFolderId);
const childFolders = parentFolder.getFolders();
let childrenList =[];
while(childFolders.hasNext()){
childrenList.push(childFolders.next().getName());
}
// 省略
getRange('B1')
はgetRange(2,1)
のような書き方でもOKです。
各行のデータを取得し、チェックが入っていればフォルダ作成する
for文で処理を回します。A列のチェックが入っているもののみの行を処理します。
今回はフォルダの名前をID
+_
+名前
とします。
// 省略
for(let i = 1; i<=last; i++){
if(sheet.getRange(i, 1).getValue()=== true) {
const name = sheet.getRange(i, 2).getValue() + '_' + sheet.getRange(i, 3).getValue();
if(!childrenList.includes(name)){
let childrenFolder = parentFolder.createFolder(name);
}
}
}
// 省略
includes
メソッドを使って配列 childrenListに、変数
nameと同じ値が含まれてないかチェックし、なければ
name`と同じ名前のフォルダを作成します。
childrenList.includes(name)
さらにフォルダを作成する
さらにデフォルトで孫フォルダをセットしておきます。
// 省略
const gcFolders = ['議事録','受領物','納品物','その他'];
// 省略
if(!childrenList.includes(name)){
let childrenFolder = parentFolder.createFolder(name);
for (var item in gcFolders){
childrenFolder.createFolder(gcFolders[item]);
}
}
// 省略
スプシにフォルダ名とリンクを追加し、チェックを外す
setValue
で値を挿入します。A列は初期値FALSEに戻して、D列にはリンク付きでフォルダ名を追加します。
// 省略
if(!childrenList.includes(name)){
// 省略
sheet.getRange(i, 4).setValue(`=HYPERLINK("${childrenFolder.getUrl()}","${name}")`);
sheet.getRange(i, 1).setValue(`FALSE`);
}
// 省略
リンク付きの値を挿入するためにHYPERLINK
を使います。
HYPERLINK(リンク,名称)
各種アクセス権限を許可しておく
プロジェクトを「保存」後、「実行」します。
すると権限を求められますので「権限を確認」をクリック。
アカウントを選択。
「このアプリはGoogleでは確認されていません」って言われるので、詳細をクリックしてプロジェクト管理(アプリ名)に移動します。
フォルダの自動生成処理を実行するメニュー追加
addMenu
でメニューを追加します。
ラベル名はname
、関数はfunctionName
として配列に格納します。
function setMenu(){
//メニュー配列
var myProject=[
{name: "プロジェク ト追加", functionName: "createProject"},
];
SpreadsheetApp.getActiveSpreadsheet().addMenu("プロジェクト管理", myProject); //メニューを追加
}
setMenu
に切り替えて実行します。
「プロジェクト管理」メニューが追加されます。これでスプシ上操作できるようになりました!!
すべてのコード
function setMenu(){
//メニュー配列
var myProject=[
{name: "プロジェクト追加", functionName: "createProject"},
];
SpreadsheetApp.getActiveSpreadsheet().addMenu("プロジェクト管理", myProject); //メニューを追加
}
function createProject() {
// シュートの取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('project');
// 最終行取得
const last = sheet.getRange(2, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
// 孫フォルダ
const gcFolders = ['議事録','受領物','納品物','その他'];
// Projegtフォルダ取得
const parentFolderId = sheet.getRange('B1').getValue();
const parentFolder = DriveApp.getFolderById(parentFolderId);
const childFolders = parentFolder.getFolders();
// 既存フォルダの名前を配列化
let childrenList =[];
while(childFolders.hasNext()){
childrenList.push(childFolders.next().getName());
}
// 子フォルダ生成
for(let i = 1; i<=last; i++){
if(sheet.getRange(i, 1).getValue()=== true) {
const name = sheet.getRange(i, 2).getValue() + '_' + sheet.getRange(i, 3).getValue();
if(!childrenList.includes(name)){
let childrenFolder = parentFolder.createFolder(name);
for (var item in gcFolders){
childrenFolder.createFolder(gcFolders[item]);
}
// ドライブのリンクをシートに挿入
sheet.getRange(i, 4).setValue(`=HYPERLINK("${childrenFolder.getUrl()}","${name}")`);
// チェックボックスのチェックを外す
sheet.getRange(i, 1).setValue(`FALSE`);
}
}
}
}
トリガーを設定して常に表示するようにする
最後にスプシ起動時、常にメニューが表示されるように設定しておきます。
トリガーから「トリガーを追加」を選びます。
関数にsetMenu
をセット。あとは、デフォルトのままで大丈夫です。
まとめ・少しコードを書けばGoogle系のツールは自動化可能!
煩わしいなあって思っていたフォルダ作成などの処理がボタン操作で可能になりました!
シートを見れば一目瞭然になりました。
少ない人数で仕事していると雑務もすべて自分でしないといけないので、少しでも減らして本業に集中したいものです。
ァイルアップロードとリネームを自動化したい方はこちらもどうぞ!
プログラミングで事務作業を自動化してラクしよう!前回に続き、Google Apps Scriptを使ってファイルを管理す...
スプレッドシート(Googleスプレッドシート)の最新の内容をトリガーを使って定期的にGメールやSlackで通知するGo...
この記事が皆さんの事務作業時短の一助となれば幸いです。
最後までお読みいただきありがとうございました。
おまけ・配列の並べ替え
getFolders
で取得したデータはせっかく連番idを付与しても更新などで順番が入れ替わります。
連番で配列が取得したい場合は、sort
で並べ替えできます。
let array = [];
while(folders.hasNext()){
let f = folders.next();
array.push(f.getName()]);
}
array.sort(function(a, b) {
if (a > b) {
return 1;
}else {
return -1;
}
});