Last active
March 6, 2023 07:54
-
-
Save Tomokatsu-Sakamoto/c7fceb569b3d1dc19333d2c0819179e4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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