ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Google スプレッドシート + GAS(Google Apps Script)でonEditが2回実行されてしまう

Google スプレッドシート + GAS(Google Apps Script)でonEditが2回実行されてしまう

概要 GAS(Google Apps Script)を使って、Google スプレッドシートの編集時に追加処理を行うスクリプトを用意した際に、Google スプレッドシートの編集によって、onEdit関数が2回実行されるケースがありました。 原因と解決策 原因は、スプレッドシートの編集時のトリガーとしてもonEdit関数を選択していることが原因でした。 onEdit関数は予約済みの関数であるため、トリガーの設定を行う必要がありませんでした。 まとめ 同様の事象でお困りの方の参考になりましたら幸いです。

GoogleドライブとGoogle Apps Scriptを用いて匿名のファイルアップローダを作成する

GoogleドライブとGoogle Apps Scriptを用いて匿名のファイルアップローダを作成する

概要 GoogleドライブとGoogle Apps Scriptを用いて匿名のファイルアップローダを作成する機会がありましたので、その備忘録です。 以下の記事などを参考にさせていただきました。 https://qiita.com/v2okimochi/items/06ed1ce7c56a877a1e10 ウェブアプリの作成 まず、以下のURLから、Apps Scriptにアクセスします。 https://script.google.com/ 「新しいプロジェクト」をクリック。 以下のような画面が表示されます。 以下のコードをコピペします。2行目の<Google Driveのアップロード用フォルダのID>について、事前にGoogleドライブでアップロード用のフォルダを作成しておき、そのIDを取得しておいてください。 // 定数: Google Driveのアップロード用フォルダのID const FOLDER_ID = '<Google Driveのアップロード用フォルダのID>'; // doGet関数: index.htmlファイルを表示する function doGet() { return HtmlService.createHtmlOutputFromFile('index'); } // processForm関数: フォームオブジェクトを受け取り、Google Driveにファイルをアップロードする function processForm(formObject) { // フォームからファイルデータを取得 var formBlob = formObject.myFile; // アップロード用フォルダを取得 var uploadFolder = DriveApp.getFolderById(FOLDER_ID); // 現在の日時をフォルダ名に使用 var today = new Date(); const folderName = today.toString(); // アップロード用フォルダ内に新しいフォルダを作成 const customFolder = uploadFolder.createFolder(folderName); // 新しいフォルダ内にファイルをアップロード customFolder.createFile(formBlob); // 新しいフォルダ名を戻り値として返す return folderName; } 次に、画面左上の「+」ボタンを押して、HTMLを選択します。 ファイル名に「index」を与えます。 以下のコードをコピペします。 <!DOCTYPE html> <html> <head> <base target="_top"> <script> // フォームのデフォルトの送信動作を無効にする function preventFormSubmit() { var forms = document.querySelectorAll('form'); for (var i = 0; i < forms.length; i++) { forms[i].addEventListener('submit', function(event) { event.preventDefault(); }); } } window.addEventListener('load', preventFormSubmit); // アップロードボタンを最初は無効にする document.addEventListener("DOMContentLoaded", function () { document.getElementById("upload").disabled = true; }, false); // 制限サイズ以内のファイルが選択されたらアップロードボタンを有効にする function changeSubmitButton() { const len = document.getElementById("file").files.length; const size = document.getElementById("file").files[0].size; const maxSize = 1024 * 1024 * 10; // 10MB const uploadButton = document.getElementById("upload"); if (len > 0 && size < maxSize) { uploadButton.disabled = false; } else { uploadButton.disabled = true; } } // アップロードボタンが押されたらファイルをアップロード function handleFormSubmit(formObject) { document.getElementById("upload").disabled = true; const div = document.getElementById('progress'); div.innerHTML = 'アップロード中...'; // アップロード成功した場合はupdateView()実行 google.script.run.withSuccessHandler(updateView).processForm(formObject); } // アップロード完了画面に変える(動的) function updateView(id) { var div = document.getElementById('myform'); div.innerHTML = `<div>アップロードが完了しました。</div>`; } </script> </head> <body> <div id="myform" style="text-align:center;"> ファイルを選択してからアップロードしてください(10MBまで)<br><br> <form onsubmit="handleFormSubmit(this)"> <input id="file" name="myFile" type="file" onchange="changeSubmitButton()" /> <input id="upload" type="submit" value="アップロード" /> </form> <div id="progress"></div> </div> </body> </html> デプロイ 画面右上の「デプロイ」ボタンをクリック後、「新しいデプロイ」をクリックします。 ...

What to do when

What to do when

Overview When creating a large number of files on a shared drive, I encountered an error message “An error has occurred in Google Drive. and the file could not be saved. The cause of the above may be that the file was caught by the shared drive limitation shown below. https://support.google.com/a/answer/7338880?hl=en *The maximum number of items that can be stored on a shared drive The maximum number of items that can be stored on a shared drive is 400,000. This includes files, folders, and shortcuts. * ...

「Google ドライブでエラーが発生しました。」が生じた時の対処方法:共有ドライブのゴミ箱を空にするスクリプト

「Google ドライブでエラーが発生しました。」が生じた時の対処方法:共有ドライブのゴミ箱を空にするスクリプト

概要 共有ドライブに対して大量のファイルを作成した際、以下のように「Google ドライブでエラーが発生しました。」が表示され、ファイルを保存できなくなる事象に出会いました。 上記の原因として、以下に示す共有ドライブの制限に引っかかったことが考えられます。 https://support.google.com/a/answer/7338880?hl=ja 共有ドライブに保存できるアイテム数の上限 共有ドライブに保存できるアイテム数は最大 40 万個です。これにはファイル、フォルダ、ショートカットが含まれます。 1 日のアップロードの上限 個々のユーザーがマイドライブおよびすべての共有ドライブにアップロードできるのは、1 日あたり 750 GB までです。 2つ目の「1日のアップロードの上限」に引っかかってしまった場合には、1日待つほかないと思います。 一方、1つ目の「共有ドライブに保存できるアイテム数の上限」について、不要なファイルを削除することで対応することができます。 ただし、単にファイルを削除しただけでは、それらがゴミ箱に残ってしまい、(おそらく)先の制限を解除することができません。そこで、共有ドライブのゴミ箱を空にするスクリプトを探したところ、以下の記事に辿り着きました。 https://stackoverflow.com/questions/57764248/is-there-a-script-to-empty-google-team-drive-trash-related-folders 以下、上記で紹介されているスクリプトの使用方法について説明します。これにより、先述した「共有ドライブに保存できるアイテム数の上限」に引っかかってしまった際、その制限を解除することができます。 共有ドライブのゴミ箱を空にするスクリプトの実行方法 以下のスクリプトをコピペして利用します。 const driveId = "<共有ドライブのID>"; function myFunction() { var optionalArgs={driveId, 'includeItemsFromAllDrives':true, 'corpora': 'drive', 'supportsAllDrives': true, 'q':'trashed = true' } while(true){ var trashed=Drive.Files.list(optionalArgs).items; console.log("削除対象のファイルサイズ", trashed.length) for(var i=0;i<trashed.length;i++){ //console.log(i, trashed[i].id) try { Drive.Files.remove(trashed[i].id, {'supportsAllDrives':true}) } catch (e){ //console.log({e}) } } if(trashed.length == 0){ break } } } まず、以下のURLにアクセスしてください。 https://script.google.com/home そして、下図に示す、「新しいプロジェクト」をクリックします。 先のスクリプトをコピペしてください。コピペ後、一行目の「driveId」を変更し、画面上部の「保存」ボタンを押してください。 次に、サービスを追加します。「サービス」から「Drive API」を追加してください。 その後「実行」ボタンを押します。 初回は承認が求められます。 以下に示すように、100件ずつ削除されていきます。 一定時間が経過すると、以下のようにエラーが発生します。その場合には、再度「実行」ボタンを押してください。 まとめ よりよい解決策があるかもしれませんが、「Google ドライブでエラーが発生しました。」等でお困りの方の参考になりましたら幸いです。 追記 2022.05.06 GASでは、スクリプトの実行時間が6分間という縛りがあるそうです。 ...

Google Drive内のファイルオーナーの一括更新プログラムを作成しました。

Google Drive内のファイルオーナーの一括更新プログラムを作成しました。

Google Drive内のファイルオーナーの一括更新プログラムを作成しました。 以下、権限を移譲する人と移譲される人に分けて説明します。 なお、このプログラムでは、PDFや画像ファイルの権限移譲はできませんので、ご注意ください。対応方法については後述します。 オーナー権限を移譲する人 以下のリンク先のGoogle Apps Scriptにアクセスし、手順に従って進めてください。 https://script.google.com/d/1k6ZiwHNeJSvc4W7uRmc_DfSSmwGOWCbUriLBy0MpuoEAgWvcVNdyRMDa/edit?usp=sharing Apps Scriptのページに遷移後、「実行」ボタンを押してください。 必要に応じて、一行目の「BASE_FOLDER_ID」の値を修正してください。ここで指定したフォルダ以下のフォルダを再帰的に探索します。 実行後、承認が求められます。以下の画面キャプチャに従って、許可してください。 実行後、画面上部の「実行ログ」を押すと、画面下部に実行ログが表示され、「実行完了」が表示されたら完了です。 なお、この方法では、PDFや画像ファイルの権限移譲はできません。権限移譲できなかったファイルの一覧が、自分のマイドライブの直下に「Google Driveのオーナー一括更新のエラー_yyyy-MM-dd HH:mm:ss.csv」という形式のファイル名で出力されます。 自分のマイドライブは以下でアクセスできます。 https://drive.google.com/drive/my-drive csvファイルは、Googleスプレッドシートなどでファイルを開くことができます。本ファイルにリストされたファイルについては、手動での権限移譲が必要です。 なお、2022年3月9日時点においては、ドメインを横断した権限移譲はできないようです。したがって、一般アカウントで作成したファイルについては問題ありませんが、東京大学のアカウント(g.ecc.u-tokyo.ac.jp)等で作成したファイルについては、他のドメインのユーザへの権限の移譲ができない点に注意してください。 オーナー権限が移譲される人 権限が移譲されたオーナーには、以下のようなメールが(大量に)届きます。 これらに対して、一つずつ「承諾」ボタンを押すのは大変です。 そこで、Googleドライブにアクセスして、検索フォームに以下のように入力します。 pendingowner:me これにより、オーナー権限の譲渡リクエストがあるファイルのみを一覧できます。 また、以下のように、owner:(メールアドレス)を追加すると、リクエスト元のユーザを限定できます。以下、「na.kamura.1263@gmail.com」を指定する例を示します。 pendingowner:me owner:na.kamura.1263@gmail.com これにより、指定したメールアドレスから、オーナー権限の譲渡リクエストがあるファイルのみを一覧できます。 この一覧から、複数のファイルを一括選択し、右クリック後の「共有」ボタンから、一括で「承諾」を行うことができます。 まとめ Google Drive内のファイルオーナーの一括更新を検討されている方の参考になりましたら幸いです。