GoogleForm x GoogleSpreadsheet x GoogleDrive
内容
Googleフォームのアンケートに顧客が回答したら、スプレッドシートに用意してある固有IDを付与させる。付与した固有IDをフォルダ名として、Googleドライブにフォルダを作らせる。個人的にフォルダというワードを使うのが抵抗あるのでこれより先フォルダのことをディレクトリと書かせていただきます。
目的
ディレクトリ作成の自動化
Googleフォームの回答がある度に手動でディレクトリを作るのが面倒
要件
- 固有IDは事前に別シートに用意したものを用いたい
- 回答結果がスプレッドシートにリアルタイムで反映されるタイミングで、付与した固有IDも隣に表示させたい
- コピー元のディレクトリをあらかじめ用意しておくのでそれを名前を変えて固有ID名でコピーさせたい
- コピー元のディレクトリにはファイルが入っているので、そのファイルも含め再帰的にコピーさせたい
- アンケートの返答があり次第、逐一ディレクトリを作らせたい(まとめてドンではない)
システム
以下のようなシステムを考えました
- フォームの回答結果がスプレッドシートに即時反映される
- 設定したトリガーの条件にマッチしてformsFunctionが実行される
- 別シートに用意した固有IDのリストを取得
- フォームの最後の行番号とそれに紐づくA列のセルを取得
- 該当セルの行番号をインデックスにして、固有IDのリストの中から固有IDを付与
- 付与した固有IDを該当セルの値に設定することで、固有IDが回答結果の隣(A列)に表示される
- 付与した固有IDを引数にディレクトリをコピーする関数を呼び出す
- GoogleDriveにあるコピー元のディレクトリを引数(固有ID)名でコピー構築する
手順
上記システムを実現するための手順です
コピー元ディレクトリの準備
以下のようにコピーさせたいディレクトリとその中身のファイルをGoogleDrive上に準備してください
私の場合、COPYMEというディレクトリの中に税務書類等.txtファイルを配置してあります
このCOPYMEがコピー元ディレクトリになります
Googleフォームの作成
Googleフォームを作成します
回答タブ、スプレッドシートにリンクをクリックすることで回答結果をスプレッドシートに連携させます
スプレッドシートの準備
シートを追加をクリックして、写真のようにあらかじめ用意した顧客の固有IDリストを別シートに準備しておきます
また、フォームの回答シートのA列が回答結果のタイムスタンプになってると思うので、左に列を追加してください。この追加したA列に固有IDを付与します。また、タイムスタンプが邪魔なので私はB列を非表示に設定しました。
Google App Scriptの作成
Google App Scriptを以下のコードに差し替えてください
function formsFunction() {
// 固有IDのリストを取得します
var values = getValues();
var spreadsheet = SpreadsheetApp.openById('ここにスプレッドシートのIDを代入してください');
var sheet = spreadsheet.getSheets()[0];
// GF最後の行&&A列
var range = sheet.getRange(sheet.getLastRow(),1);
// 空だったら固有IDを追加
if(range.isBlank() == true){
range.setValue(values[sheet.getLastRow()-2]);
// 固有IDを引数にして関数呼び出し
copyFolder(values[sheet.getLastRow()-2]);
}
}
function getValues() {
// スプレッドシート&シートオブジェクトを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('ID_list');
// A列の範囲を取得 (全範囲になってるので必要最低限な行に絞った方がスマート)
var range = sheet.getRange('A:A');
// セルの値を取得
var values = range.getValues();
// 取得したデータを実行ログに表示
console.log(values);
return values;
}
function copyFolder(cliantName) {
// コピー元のフォルダID
var folderId = "ここにあなたのフォルダIDを代入してください";
// 新しいフォルダ名
var newFolderName = cliantName;
// コピー元のフォルダを取得
var sourceFolder = DriveApp.getFolderById(folderId);
// 新しいフォルダを作成
var newFolder = sourceFolder.getParents().next().createFolder(newFolderName);
// サブフォルダを再帰的にコピー
copySubFolders(sourceFolder, newFolder);
// フォルダ内のファイルをコピー
copyFiles(sourceFolder, newFolder);
Logger.log("フォルダをコピーしました。");
}
// サブフォルダを再帰的にコピーする関数
function copySubFolders(sourceFolder, newFolder) {
var subFolders = sourceFolder.getFolders();
while (subFolders.hasNext()) {
var subFolder = subFolders.next();
var newSubFolder = newFolder.createFolder(subFolder.getName());
copySubFolders(subFolder, newSubFolder);
copyFiles(subFolder, newSubFolder);
}
}
// フォルダ内のファイルをコピーする関数
function copyFiles(sourceFolder, newFolder) {
var files = sourceFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
file.makeCopy(file.getName(), newFolder);
}
}
ちなみにスプレッドシートののIDはhttps://docs.google.com/spreadsheets/d/xxxx/
のxxxx
の部分です。
トリガーの設定
以下トリガーの設定です
これで準備は以上です
テスト
Googleフォームを回答してみてください
- スプレッドシートへの回答結果の反映
- 固有IDの付与と表示
- Googleドライブへのディレクトリ作成
が同時に行われるのを確認できます
以上
はじめてのGAS体験でした