2019年4月23日火曜日

【G Suite】GAM でGoogleグループへのメンバー一括登録方法(macOS編)

過去に、Google Apps Manager (GAM) を使っていろいろやろう にて触りの部分は書いていましたが、少し本格的に使わないといけなくなったので改めてまとめます。Google グループの一括作成方法については

を見ればわかると思いますので、ここでは一括登録のみに特化します。

なお一括登録前にバックアップ、すなわち現在登録済みのメンバー一覧のエクスポートから説明しておきます。

なお以下は、G Suite 専用であり、G Suite 管理コンソールにログイン可能な特権管理者向けのドキュメントとして残しておこうと思ってまとめたものです。

  • 前半:すでにインストールした状態での利用方法
  • 後半:macOSへのGAMのインストール方法

グループのメンバー一覧エクスポート


1.  GAMを使った場合


グループ名:sample-ml
MLメールアドレス:sample-ml@example.com 

と仮定します。

gam  info  group  sample-ml
....
....
 member: メールアドレスA (user)
 member: メールアドレスB (user)
 member: メールアドレスC (user)
 member: メールアドレスD (user)
 member: メールアドレスE (user)
 owner: メールアドレスF (user)
 manager: メールアドレスG (user)

のように出てきます。したがって
  • gam  info  group  sample-ml  > sample-ml-back.dump
とかファイルに出力すれば、グループの設定やメンバー(オーナーやマネージャーもわかる)を取得できます。

さらにメンバーが何名登録されているかが末尾に出力されます。

2. Googleグループの管理画面よりエクスポート



上記のように、Googleグループのメンバー一覧表示のバーに「メンバーをエクスポート」があります。もちろん管理権限を持っている必要があります。

これでエクスポートすると BOM無しUTF-8のCSVファイルで保存されます。
これを Microsoft Excel で開くと文字化けします。文字化けしたくないなら、BOMありのUTF-8に文字コード変換してあげてください。

macOS であれば、CotEditor というテキストエディタで開いて


のように文字コードを BOM付きにして上書き保存したらよいでしょう。
こちらはステータス(配送エラー等)がわかるので、便利です。

Googleグループへのメンバー登録


  • gam  update group  グループ名  add member  メールアドレス

もし Word等で一行一メールでメールデータを大量にもらったのなら、それを一旦テキストファイルに保存し直した上で
  • cat  ファイル名  | awk  '{print "gam update group グループ名  add member "$1}' 
にて正しくコマンド一覧ができているか確認した上で、
  • cat  ファイル名  | awk  '{print "gam update group グループ名  add member "$1}'  | bash
で一括登録できます。実際には出力結果をリダイレクトしてファイルに保存しておくことをオススメします。
  • cat  ファイル名  | awk  '{print "gam update group グループ名  add member "$1}'  | bash  >  グループ名.log 
あたりでしょうか。

登録成功
+ ./gam update group グループ名 add member メールアドレス
 Group: グループメールアドレス, メールアドレス Add as MEMBER 

すでに登録済みのため追加しない
+ ./gam update group グループ名 add member メールアドレス
 Group: グループメールアドレス, メールアドレス Add as MEMBER Failed: Duplicate, already a MEMBER

と出てくるので、

追加を試みたメールアドレス数
grep -v '+'  グループ名.log  | wc

すでに登録済みだったメールアドレス数
grep -v '+'  グループ名.log  | grep Duplicate | wc

などをすると、登録状況がわかるかなと思います。
このあたりはコマンドでいろいろできる人なら、いろいろできるでしょう。

注意!


必ず作業する前にバックアップをしておきましょう。
万が一ミスっても、バックアップしておけば戻せますよね(最悪メンバー一覧情報があれば)
  • gam info group グループ名 > バックアップファイル名


GAM を macOS にインストール



まず最初に注意ですが、gam はコマンドラインで G Suite を直接管理するためのものです。つまり G Suite の特権管理者がメンバーの一括登録をしたいときなどにつかうだろうと思いますので失敗したら Googleグループをあっさり削除してしまったり、ユーザーを削除してしまう事がありうるということです。そのことを正しく認識した上で使ってください。つまりコマンド操作に不慣れな人は使わないほうがよいということです。

また、つかうとき以外は機能OFFにすると安心かもしれません。
  • G Suite管理コンソール > セキュリティ  > API アクセス が ON
になっていることが条件になり、ここを普段 OFF にしているとアクセスを遮断できます。
なおここがOFFになっていると

  • ERROR: 403: Domain cannot use apis. - domainCannotUseApis

のようにエラーがでます。

1. gam を macOS にインストール

bash <(curl -s -S -L https://git.io/install-gam)

Can you run a full browser on this machine? (usually Y for MacOS, N for Linux if you SSH into this machine) N

*これ Yにすると、ブラウザベースで認証をしようとしますが、 localhost:8080 にアクセスできず(いろいろしましたが)、結局 ssh のほうにしました。

Please enter your G Suite admin email address: 特権管理者のメールアドレス
Go to the following link in your browser:
URL
Enter verification code: URLにアクセスし出てきた codeを貼り付ける
が出てくるので、URLにブラウザからアクセスして、特権管理者のメールアドレスでログインします。そうすれば、verification codeが出てくるので、これをコピーして貼り付けます。

次に

https://console.developers.google.com/apis/credentials?project=gam-project-****
1. Click the blue "Create credentials" button. Choose "OAuth client ID".
2. Click the blue "Configure consent screen" button. Enter "GAM" for "Application name".
3. Leave other fields blank. Click "Save" button.
3. Choose "Other". Enter a desired value for "Name". Click the blue "Create" button.
4. Copy your "client ID" value.

というのが出てくるので、支持に従って Google Developer Console にて GAM用のプロジェクトを作成して、クライアントIDクライアントSecretキーを取得してください。このあたりの詳細は説明しません。これができないレベルだと、使うのは危ないためです。

あといくつかの質問がありますが、割愛します。
どのAPIに許可を与えるのか等、個別に考える内容のためです。とりあえず今回は Googleグループに対する権限があればよいです。

でうまく行けば、

GAM installation and setup complete!
Please restart your terminal shell or to get started right away run:
gam() { "/Users/ユーザー/bin/gam/gam" "$@" ; }

に入ります。
$HOME/bin/gam あたりに PATHを通しておくか、直接 gam を実行すればよいでしょう。

GAM が使えるかの確認


$HOME/bin/gam/gam info domain 

として、G Suite のドメイン情報が出てきたらアクセスできていることになります。

なお以下、説明時に $HOME/bin/gam/gam は gam に置き換えます。

またコマンド詳細
  • $HOME/bin/gam/GamCommands.txt
にすごく見づらいですが載っていますのでここを見ればよいです。

2019年4月23日 @kimipooh

2019年4月2日火曜日

ついに Gmailに予約送信機能が・・・!?

2019年4月1日に、公式ブログ(Gmail Blog)において、

が公開され、その中で Schedule send(予約送信)の機能がアニメーション付きで紹介されていました。エイプリルフールネタかなぁと思ったのですが、ブログ最後に
  • We may have launched Gmail on April Fools’ Day, but the last 15 years have been no joke. And we’re looking forward to what’s to come.
とあるように、いたずらじゃないよーって言っているので期待大ですね!

2019年4月2日 @kimipooh

2019年3月22日金曜日

Googleアカウントの作成リンク「アカウントを作成」をクリックすると、「自分用」「ビジネスの管理用」が出てくる!?

Googleアカウントの作成リンク「アカウントを作成」をクリックすると、「自分用」「ビジネスの管理用」が出てくる!?






これはなんだという疑問をつぶやいた方がいたので調べてみました。

G Suite アカウントでログインしようとすると出てくる




これは、独自ドメインを持つメールアドレスで Googleアカウントを個人作成した上で、その後にその独自ドメインで G Suite を契約したときに起こる競合するアカウントの場合です。この場合、少なくても Gmailについては「個人のGoogleアカウント」でログインしようにも出来ません(パスワードが通らない)。

ビジネス向けサービスのカスタマイズに使われる?


Googleアカウント作成時に出てくる「自分用」「ビジネスの管理用」の選択肢は、Googleマイビジネス、広告、G Suite,ビジネス向け Google Play などのビジネス向けサービスについてのカスタマイズに使われるようです。なお、この設定は後から変更できます。


にあるように、Googleアカウントのビジネスカスタマイズの部分をチェックすると




最初に述べたようにビジネス向けサービスのカスタマイズに使われることがわかります。

2019年3月22日 @kimipooh

2019年3月8日金曜日

【GAS】Googleドライブ / チームドライブの特定フォルダ以下のファイル一覧を表示する方法

表示先は Googleスプレットシートにします。

のコードをちょろっとカスタマイズしたものです。

カスタマイズした点
  1. 作成するシート「YYYYMMDD」が存在した場合は、そのシートデータをクリアする
  2. チームドライブ場合、ファイルのオーナー値がないのでそのエラー処理を追加
  3. 最終更新日を追加

使い方


*導入方法は後述します。


1. 後述するGoogle Apps Scriptを仕込んだ Googleスプレットシートを開く

2. 上部メニューの一番右に「GAS」メニューが追加されています。これをクリックして「リスト作成」を選択します。


3. 一番最初にアクセスしたときに、認証画面がでます。


の ② を参考に、「許可」してください。

うまくいけば、


のようにファイルリストを Googleスプレットシートのシート「YYYYMMDD」(本日の日付)に表示してくれるはずです。

*なおチームドライブの場合、オーナーはチームドライブにありユーザー側にはありません。そのため、ファイルのオーナー情報が取得できない場合には「チームドライブ」という文字を挿入してます。

セットアップ方法


1. 一覧表示したいGoogleドライブ(チームドライブ含む)フォルダにウェブからアクセスします(https://drive.google.com)。

2. URLをみて、フォルダIDを調べます。
  • https://drive.google.com/drive/folders/フォルダID
これをメモっておきます。

3. Google Apps Script のテンプレート「getFolderlist」を開きます。
4. 「Raw」ボタンをクリックし、スクリプトをすべて選択してコピーします。

5. Googleスプレットシートを新規作成します。

6. ツール > スクリプトエディタ を開きます。


のコードをすべて削除して、「4.」でコピーしたスクリプトをペーストします。
そして保存(ファイル > 保存)します。
ファイル名は「getFolderlist」とします。
*名前はなんでもいいですが、説明上そうしておきます。

7. フォルダIDを設定します。
  • var Folder ID = "[Folder ID]";
について、[Folder ID] を「2.」でメモしたフォルダIDに置き換えます。
https://drive.google.com/drive/folders/フォルダID
*[Fold


保存(ファイル > 保存)



8. Googleスプレットシートを読み込み直します

ブラウザの再読込みか、一度閉じて開き直します。

上部メニューの一番右に「GAS」メニューがあればスクリプトが実装されているといえるので、これで準備は完了です。


付録. 特定フォルダ以下のサブフォルダ一覧表示


セットアップの「3.」のテンプレートを下記に置き換えると可能です。


2019年3月8日 @kimipooh

2019年3月5日火曜日

【ボツ / 備忘録】Gmailで予約送信するための Googleフォームを作成しよう!

数日前に、Gmail に予約送信機能を実装するには・・・ という記事を書きました。その中で、「Gmailの下書き+スター」+「Google Apps Script」を使った予約送信システムの全貌について詳しく説明したスライドを作成しました。

このシステムでは、件名の冒頭に {YYYY/MM/DD hh:mm} を入れることで、年/月/日 時:分以降に予約送信する仕組みを説明したものでした。実際には1時間ごとにチェックしたりするので、チェックする間隔によって時刻(時:分)ぐらいは遅延します。

件名の冒頭に {YYYY/MM/DD hh:mm} いれるのってミスする可能性あるんじゃない?


全角にしてみたり、フォーマットをミスったり、、ありえそうですよね。とりあえずスクリプトで YYYY/MM/DD と hh:mm スペースが複数あっても大丈夫なようにはしました。しかし予期せぬ入れ方をする人もいるでしょう。

Googleフォームで入力したデータをGmail下書きに保存してくれたら便利じゃない?


とまぁ思ったわけです。実際に、Googleフォームで入力したデータをGmailの下書きとして保存するという情報はネット上にありました。ならできそうだよね!?

やってみましょう!


ということで一日ぐらいかけてゴニョゴニョして完成させたのでした!

でも使えねぇ




筆者のGoogle Apps Scriptに関する技術が足りていない可能性はあります。そのため備忘録として残しておけば、いつかうまくいく日が来るかも知れません。そういう思いもあって残しておくことにしました。

何が問題かというと、Googleフォームは基本的にURLを知っていたら誰でもアクセスできます。G Suiteなら、G Suiteドメイン内のユーザーのみには限定できます。しかし特定個人には限定できません。一方、送信したデータは、Googleフォーム作成者のGmail下書きに保存されます。となるとURLを知られてしまったら、G Suiteならドメインユーザーぐらいまでには限定できますが、いずれにしても他人に自分のGmailの下書きにデータを勝手に保存されてしまうことを意味します。これはセキュリティ的にまずいですよね。

で、Googleフォームで特定アカウント以外がアクセスすると「送信」をdisabled 出来たら問題ないと思いました。しかしそれをどう実装するか分かりませんでした。
なおフォーム送信をして、Googleスプレットシートに保存まではされますが、Gmailへのアクセスはブロックできます。しかし、フォーム送信できてしまう段階で、うまくいけた!って思い込んでうっかり別アカウントを使って送信した場合、予約できていない可能性があります。そうなると運用上まずいから使えねぇ、、なのです。

以上を踏まえた上でどのように実装するかを説明します。

どうやるのか






上記スライドをご参照あれ〜。

2019年3月5日 @kimipooh

2019年3月1日金曜日

Gmail に予約送信機能を実装するには・・・

Gmail自体に予約送信機能(2019年3月1日時点)はありません。
*2019年4月1日に、予約送信機能の実装を計画しているよーという内容がアニメーション付きで、Hitting send on the next 15 years of Gmail(Google)に掲載されています。そのため、いずれ実装されるかなぁと思います。

いずれにしても、現時点(2019年3月1日)ではないため、欲しいのなら他の方法を考えなければなりません。筆者が所属する京都大学でも2月中旬にめでたくG Suite for Education のサービスが開始したこともあり、Google Apps Scriptでいろいろ出来ないかなぁと模索しているところでした。
そこで調べてみると、機能として実装するには下記のような方法があります。

1. サードパーティのアドオンをつかう


  1. [G Suite専用] G Suite MarketPlace で提供されている予約送信機能を追加する
  2. ブラウザのアドオンをつかう(Right Inbox, Boomerang 等)
  3. 電子メールソフトのアドオンをつかう(Thunderbird + 後で送信(アドオン))

2. Google Apps Script をつかう(自作する)


スクリプト開発サイト
アドオンがGmailにアクセスするのが許せない、心配だ!という場合もあると思います。たしかに
 Right Inbox のプライバシーポリシーには、
  • Right Inbox does not store the content of your emails.
の記述があり、ポリシー的には問題ないことになります。そうはいっても、それを信頼できるかは別の話です。となってくると自作するしかありません。

で下書きを利用したスクリプトを公開されている方がいたので、そのコードを少しいじって、使い方のマニュアルを作成してみました!



*Googleスライドの機能を使って、PowerPointやPDFに保存し直すことができます。資料については自由に使ってください。ただし免責事項(末尾記載)にあるように、現時点では動作チェックしましたが、未来に動かなくなっても責任は取りませんのであしからずー。

以下、上記スライドを書くまでの経緯です。


まずパッと思いついた方法は2つぐらいです。

1. Googleフォームで入力 ==> Googleスプレットシートに保存 ==> Googleスプレットシートを定期的にチェックして指定の日時になったらGoogleスプレットシートのデータを元にGmailを送信(Googleスプレットシート内のスクリプトエディタ:Google Apps Script + 時間トリガー)

2. Gmailに下書き保存。どこかに送信日時を入れておく ==> 下書きにある送信日時を過ぎたら送信(GoogleドライブのGoogle Apps Script + 時間トリガー)


です。後者が素直そうです。これについて作ってみようかなぁと思っていたらすでに作って公開している人がいました!!

Gmailで指定日時に送る ってのをGoogle Apps Scriptで書いた(きじとら)


そうそう、こんなことを実装したかったのだ!と思いました。
実際スクリプトを試してみると、
で筆者が出したスライドのように、「このアプリは確認されていません」という警告がでるので、「安全だよ!」という設定(詳細  > ○○(安全ではないページ)に移動)をしてあげる必要があります。
なお新規スクリプト作成については、G Suite Developer Hub 経由で作るのが見やすいですね! 下図のように実行できているかチェックすることもできます。


トリガーの時間制限に注意!!


Quotas for Google Services によれば、
  • Email read/write (excluding send)
    • 無料版   20,000 クエリ /日
    • G Suite 40,000 - 50,000 クエリ / 日(Editionによる)
  • Triggers total runtime
    • 無料版   90分 / 日
    • G Suite 3 - 6時間 / 日
だそうです。下書きのメールを read するわけですから、この制限にひっかかるのかなと思います。となると 1分ごとにチェックし、該当メール件数が 1通のみだとすると、60クエリ / 時、1,440クエリ /日 となり余裕です。しかしヒットする件数が多くなるとすぐに超えちゃいそうです。ただ、GmailApp.getDraftMessagesでの取得が 1クエリなのかヒットする件数なのかがいまいちわからない(探しきれない)ので、一度 1分ごとに実行してどうなるかチェックしてみないとだめかも知れません。

また、トリガーの実行時間も関係するかもしれません。無料版だと 90分。かりにスクリプト実行時間が 1回1秒、1分単位で実行すると 1,440秒 / 日(24分 / 日)なので、無料版だと微妙かもしれません。スクリプトの実行時間が 4秒(つまり 96分 / 日)かかると制限にひっかかりますね。


をみると 5-7秒 / 回 かかっているので、かりに 10秒 / 回 ぐらいかかると想定した場合、14,400 秒 / 日(240分 / 日 = 4時間 / 日)となり、G Suite でもギリギリということになります。1時間に1度なら、240秒 / 日 (6分 / 日)となり、余裕が生まれますね!

実際のトリガー間隔は、数時間あるいは日時ベース


予約投稿ですから、たとえば翌日以降の予約でよいというルールを設けておいて、翌日の早朝(6時とか7時)の1日に一度のみ実行することにして、予約は日のみ(時間は 0:00 と固定する)という手もあります。

あるは1時間おきにチェックして、予定している時間より最大1時間遅れるぐらいな気持ちで運用する( 10:00 に設定したら、遅くても11時ぐらいには送信される、つまりその日銃に送信されるよ)という感じにすれば十分です。


このように時刻まで厳密にしなければいくらでも運用の方法はありえます。


下書き&スターがあれば実行するにカスタマイズ!


送信予約日時を件名にセットして下書きにいれただけだとうっかり書きかけで送信してしまうかも知れません。Gmailは一文字でも変更したら下書きに自動保存するためです。そこで、さらに「スター」がついている場合のみ実行するよう変更すればどうかと思いました。

つまり
  1. {年/月/日 時:分} 件名 を入れて下書きに保存
  2. その下書きにいれたメールに「スター」をつける
この2つの条件が一致したときのみ、実行すればよいという仕組みです。こうすれば下書きにいれただけでは送信されません。

というわけで 2についてカスタマイズしたのでした。
そのコードは



に公開しました。

2019年3月1日 @kimipooh

【備忘録】Gmailのコンテキストメニュー(右クリック)が大幅強化!

年度末でバタバタしていて気づいてなかったのですが、Web版Gmailのコンテキストメニューが大幅強化したようですね!

によれば、G Suiteの場合即時リリース設定だと2月11日から提供が始まり、計画的リリース設定(一般含む)だと2月22日(G Suite Release Calendar)から提供開始されたとのこと。

コンテキストメニュー




返信と、送信者による検索あたりが地味に嬉しいかなぁと思います。

2019年3月1日 @kimipooh