やりたかったこと
どいつもこいつも社内のGoogle共有スプレッドシートに自分の署名を入力しないので、GASで自動的にメモを入れてやろうと考えた。
むしゃくしゃしてやった。今も反省してない。
この記事のポイント
- GSUITEでないと更新者情報(email)は取得できない
- onEdit(event)はプロジェクトのトリガーとして設定しなくても良い
- user.getEmail()は「メールアドレスの表示」が許可されていないと使えない
- メールアドレスを取得するようなコマンドを実行しない限りアクセス許可を求めてこない
GSUITEでないと更新者情報(email)は取得できない
割と有名かとは思うけど改めて言及しておきます。
Google SpreadsheetやForms等にアクセスしてデータを入力した人のユーザー情報は、GSUITEの同一ドメインのユーザー同士でしか取得ができないです。
https://developers.google.com/apps-script/reference/base/user
onEdit(event)はプロジェクトのトリガーとして設定しなくても良い
とりあえずシートの作り方とかスクリプトエディタの立ち上げ方は飛ばします。
その辺わからない方はGoogle先生に聞いてください。
記事のタイトルであるGoogleSpreadsheetで入力したセルへ自動的に更新者情報のメモを入れるコード自体は以下で終了です。
function onEdit(e) {
var range = e.range;
range.setNote('Last modified: ' + e.user.getEmail());
// Logger.log(e);
}
私の感覚だとonEditをスクリプトエディタからプロジェクトのトリガーとして設定する必要があると考えていたのですが、onEditに関しては最初から自動で実行されているようです。
似たようなものにonChangeがありますが、こちらはプロジェクトのトリガーを明示的に設定しないと動きません。
この辺に関しては以下のブログを参考にさせて頂きました。
まだ中学生のブログ
user.getEmail()は「メールアドレスの表示」が許可されていないと使えない
ここからが実際に私がハマった箇所になりますが、上のコードを実行しただけでは上手く行かないんですよ。
具体的には渡されたe.userには何も入っていません。
入力されたセルにはsetNoteによって”Last modified: ”のメモだけ書き込まれます。
以前私が作った別のスプレッドシートやフォームではユーザー取得は上手く行っていたのに…はて?
スクリプト中にSession.getActiveUser().getEmail()のようなコマンドを実行しない限りアクセス許可を求めてこない
GASを作ったことがある人なら必ずと言っていいほど見かけたことのあるこのダイアログ。
今回の手順では、これが出てきていません。
こいつを出すためには、コーディング中のどこかの場面で許可が必要なコマンドを実行させる必要があるのですが、今回のように単に渡されてきたUser classを叩いてもそもそもClassが渡って来ていないので何も起こりません。
メールアドレスを取得するようなコマンドを実行する必要がある
というわけで今回は
function onEdit(e) {
Session.getActiveUser().getEmail(); // ← 1回許可した後は消してOK
var range = e.range;
range.setNote('Last modified: ' + e.user.getEmail());
// Logger.log(e);
}
といった感じで、メールアドレスの表示許可をGoogle先生から頂き解決する事が出来た。
(多分、スクリプトエディタのどっか弄れば許可設定できると思うけど…)
メルアドじゃなく、実名に変換して記入したいところだけど、まぁいいや。