Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Tomokatsu-Sakamoto/c7fceb569b3d1dc19333d2c0819179e4 to your computer and use it in GitHub Desktop.
Save Tomokatsu-Sakamoto/c7fceb569b3d1dc19333d2c0819179e4 to your computer and use it in GitHub Desktop.
'use strict' // 変数の宣言を強制
const FILE_ID = '';
const RESPONSE_TITLE = 'ファイルをコピーするための URL を連絡します。';
function onFormSubmit(e) {
// フォームの回答を取得
// 参考: https://developers.google.com/apps-script/guides/triggers/events#google_forms_events
// https://developers.google.com/apps-script/reference/forms/form-response
if (e.response && (FILE_ID != '')) {
let resItem = e.response.getItemResponses();
let eMail = e.response.getRespondentEmail(); // 回答者のメールアドレス
console.info('コピー先: ' + eMail);
let srcFile = DriveApp.getFileById(FILE_ID); // 元となるファイルを開く
let dstFile = srcFile.makeCopy(); // ファイルをコピーする
dstFile.setName(srcFile.getName()); // 同じファイル名を設定する
try {
/**
* コピーを作成したファイルに対して、setOwner でオーナー権を譲渡すると、元のオーナーは「編集者」に格下げになる。
* この時点では所有権は譲渡されているものの、元のオーナーのマイドライブ内に保存されたままになっている。
* 元のオーナーが「編集者」ではなくなると、元のオーナーのマイドライブ内には存在しなくなるが、
* 新オーナーのマイドライブに保存されているわけでもない。
* ファイルとしては存在しているが、場所が不明な状態となっているので、適切な場所を指定しておいた方がいいだろう。
*/
dstFile.setOwner(eMail); // オーナーを譲渡
let editors = dstFile.getEditors(); // 設定されている編集者を取得
for (let i = 0; i < editors.length; i++) {
dstFile.removeEditor(dstFile.getEditors()[i]); // 編集者に設定されているユーザーを削除
}
console.info('オーナー権の譲渡完了');
}
catch (e) {
/**
* 同じ組織内のユーザーに対しては、前述の setOwner によってオーナー権を譲渡できる。
* しかしながら、組織外や個人アカウントの場合には譲渡が行えない。
* この場合、コピーのリクエストに応じてファイルが積み重なっていくので、「編集者」の権限を付与してゴミ箱に入れてしまう。
* リクエストのあったメールアドレスには、ファイルが共有された旨が通知される。
* 通知からファイルを開くと、当該ファイルがゴミ箱に入っている旨が表示されるので、
* 「続行」ボタンを押して編集を継続し、コピーを作成する。
*/
// setOwner() で例外が発生するなら、編集権を付与してファイルを削除
console.info('オーナー権の譲渡不可 : ' + e.message);
console.log(e);
dstFile.addEditor(eMail); // 編集権限を付与
let editUrl;
let copyUrl;
let boolSite = false; // Google サイトかのフラグ
editUrl = dstFile.getDownloadUrl(); // ファイルにアクセスするための URL を取得
if (editUrl == null) {
editUrl = dstFile.getUrl(); // ファイルにアクセスするための URL を取得
}
let idx = editUrl.lastIndexOf('export=download');
if (idx != -1) { // 得られたリンクはダウンロード用のリンク
copyUrl = editUrl;
}
else {
let idx = editUrl.lastIndexOf('edit'); // 得られた URL は編集用。edit の位置を確認
if (srcFile.getMimeType() == 'application/vnd.google-apps.site') {
// Google サイトは /copy でコピーできないので、/edit のまま
boolSite = true;
copyUrl = editUrl;
}
else {
// Google サイトでなければ、/edit と /copy に変更
if (idx != -1) {
copyUrl = editUrl.substring(0, idx) + 'copy'; // edit → copy
}
else {
copyUrl = editUrl;
}
}
}
let body =
`フォームからコピーの申し込みのあった「${srcFile.getName()}」のコピーは、以下の URL から行えます。
同じタイミングで届く、ファイルが共有されたことの通知メールからファイルにアクセスすると、当該ファイルがオーナーのゴミ箱にある旨が表示されます。
このメールに記載の URL から、ファイルをコピーしてください。
eMail : ${eMail}
File name : ${srcFile.getName()}
MimeType : ${srcFile.getMimeType()}
URL : ${copyUrl}`;
if (boolSite == true) {
body += `
Google サイトはリンクでのコピーが行えないので、上記 URL からアクセスして、
「ファイルはオーナーのゴミ箱にあります」というメッセージが表示されても、「続行」ボタンを押してください。
その後、このファイルを直せず編集せず、画面右上の「三点リーダー(その他)」から「コピーを作成」を選択して、
自身の Google ドライブにコピーを作成してください。`;
}
body += `
※ 上記 URL からファイルをコピーできるのは、フォームから申請のあった Google アカウントだけです。
※ あなた専用の共有ファイルが作成され、オーナーのゴミ箱に保存されており、最長で 30日後には削除されます。
※ ファイルへのアクセスが有効なうちに、上記 URL にアクセスしてファイルをコピーしてください。`;
// テキスト化した内容をメールで返送する
const Draft = GmailApp.createDraft(
eMail,
RESPONSE_TITLE,
body,
{ name: 'Automatic Emailer Script' }
);
Draft.send();
dstFile.setTrashed(true); // ゴミ箱に入れる
}
}
}
function onOpen() { //----- 追加メニューの設定 -----
FormApp.getUi()
.createMenu('トリガー関数')
.addItem('設定', 'addTrigger')
.addItem('削除', 'delTrigger')
.addToUi();
}
function delTrigger() { //----- 登録されているトリガー関数の削除 -----
let triggers = ScriptApp.getProjectTriggers();
for (let i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]); // 現在設定されているトリガーを削除
}
}
function addTrigger() { //----- トリガー関数の設定 -----
delTrigger(); // 二重登録しないように、現時点で登録されているトリガー関数は削除
ScriptApp.newTrigger('onFormSubmit')
.forForm(FormApp.getActiveForm())
.onFormSubmit()
.create();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment