2019年8月14日水曜日

2019年12月1日より、「キャリアメール」による Google の2段階認証が廃止へ・・・

今日、下記のようなメールが各アカウントに来ました。
リンク先(詳細)をみると、
であり、どうやら2段階認証の確認コード送付についてキャリアメールはできなくなるということです。電話番号による SMSか音声メッセージに絞られるということですね。Googleアカウントは様々なところで使っているため、アクセスできなくなると大変です。確認コードは複数の手段(後述)で受け取られるようにしておくのがよいです。


設定の見直し


今回は2段階認証を有効にしていた場合
にアクセスし、下記のようにキャリアメール(筆者の場合には @ezweb.ne.jp の auの携帯メール)があったので通知がきたということでしょう。もしキャリアメールしか設定がなければ、電話番号による設定を追加して「確認済み」と出た状態で、キャリアメールのほうを削除するとよいですね。



削除は、右の編集アイコン(ペンのアイコン)をクリックし


にある「電話番号の削除」をクリックすればよいです。まぁ電話番号じゃないんですけれどね。

復旧のためのオプションは複数設定しておこう!


Googleアカウントにログインできなくなった。復旧オプションも設定していないという例は数多く見てきました。Googleアカウントは、Androidスマートフォンやタブレットをつかっているとバックアップデータを保存したり、Googleフォトなどに写真データをバックアップしたり、Google Play での購入をしているとそうした情報も紐付いています。これが使えなくなると大ダメージです。そのため、復旧オプションはできるだけ多くしておくのがよいです。

  1. SMSによる確認コード(電話番号は変更するとき注意!!)
  2. Google認証システムアプリによる確認コード(オフラインで利用可能)
     参考: https://support.google.com/accounts/answer/1066447?co=GENIE.Platform%3DAndroid&hl=ja
  3. 「Gmailアプリ」や「Google検索アプリ」によるログイン
     参考:https://kitaney-google.blogspot.jp/2016/06/google.html
  4. 信頼できるデバイスとして登録しておく
     参考:https://support.google.com/accounts/answer/2544838?hl=ja
  5. バックアップコードを発行し、保存しておく
     参考:https://support.google.com/accounts/answer/1187538?hl=ja

特に「2」「3」などをそれぞれ別の端末でしておくと、1つの端末をなくしたとしてもログインできなくなることはありません。そうしたリスク管理をしておくのがよいと思います。「5」も非常に大事ですね。

あとは再設定用のメールアドレス、電話番号を登録しておくことです。






2019年7月5日金曜日

Chrome 75 以降で MHTML形式での保存をつかう方法

以前は、chrome://flags に「Save Page as MHTML」という隠し属性を有効にすることで使えていました。しかし、Chrome 75のいずれかのバージョンからこれが消えてしまって使えなくなったということ。
Chrome拡張機能「シングルHTMLダウンローダー」を使えば、可能だそうですが、 Chrome単体でそういった機能は本当になくなったのでしょうか。
調べてみると、使える方法を見つけたので紹介します。
なおこれもまたいつ使えなくなるか分からない方法です。

起動時プションに「--save-page-as-mhtml」を指定する


「名前をつけて保存」について、



通常(起動オプション「--save-page-as-mhtml」なし)


起動オプション「--save-page-as-mhtml」あり


となり、 mhtmlをサポートしているのが見て取れます。


macOS 
  1. Chromeを終了する
  2. ターミナルを起動する
  3. 起動オプションをつけてChromeをコマンドから起動する
    open -a "/Applications/Google Chrome.app" --args --save-page-as-mhtml
Windows OS

  1. Chromeを終了する
  2. Chromeアイコンで右クリックし「プロパティ」を選択
  3. 下図の「ターゲット」の部分の末尾に「  --save-page-as-mhtml」を追加する
  4. 保存する
  5. ChromeアイコンからChromeを起動する

2019年7月5日 @kimipooh

2019年6月17日月曜日

【Windows専用】Google Drive File Stream のキャッシュフォルダをクリアするバッチファイル

Google Drive File Steamを仕事で利用することが多くなり、時々同期に失敗して初期化(アプリを終了 > キャッシュフォルダの名前変更 > アプリの起動)する必要が生じます。台数が多いと、結構手間です。そのため、それを自動でやってくれるバッチファイルを作成してみました。


に公開しています。GitHUB で基本的なことを説明してます。ここでは図を使って補足説明をします。

注意点


キャッシュフォルダ:%LOCALAPPDATA%\Google\DriveFS

Google Drive File Stream 上の Google Driveフォルダに保存する場合、

1. 端末のキャッシュフォルダにデータを一旦保存して
2. キャッシュフォルダに保存したデータを Googleドライブと同期
3. キャッシュフォルダに保存したデータを削除

の動作をしているようです。

問題ない事例


Google Drive(https://drive.google.com)に同期できているのに、他の端末では表示されない場合には Google Drive File Stream のキャッシュフォルダ内データがおかしくなっている可能性があります。そのため、キャッシュフォルダを削除することで直る場合があります。

データが消えてしまう可能性のある事例


端末上は Google Drive に入っているはずなのに、Google Drive(https://drive.google.com)をみると存在しない場合には、同期がうまくいっていません。その場合には、キャッシュフォルダにデータが入ったままになっています。
その状態でキャッシュフォルダを削除するとデータが消えてしまう恐れがあります。

そのためこのバッチファイルはキャッシュフォルダの名前変更はしますが、キャッシュフォルダそのものは削除しません。様々な状況が考えられるためです。

このバッチファイルは、なにをしているのか


キャッシュフォルダ:%LOCALAPPDATA%\Google\DriveFS

  1. Google Drive File Stream ソフトを強制終了
     *2秒待ちます。まだソフトが終了しきれていない場合があり、 2 のフォルダの名前変更が失敗するケースがあったためです。
  2. キャッシュフォルダの名前変更(DriveFSをDriveFS2へ) *もし名前変更した DriveFS2が存在すれば、先にそれを別の場所に移動するか削除するように警告メッセージを出して終了します。そして、下図のようにキャッシュフォルダの存在するフォルダを開きます。
  3. Google Drive File Streamを起動します。
     *コマンドプロンプトは、そのまま閉じるか、何かキーを押すと閉じます。

うまくいった場合のメッセージ


下図のように、ソフトを終了し、名前変更し、起動します。

 

タスクバーに Google Drive File Streamアイコンが複数出てしまった場合




のように複数出てしまった場合、実際には終了していますがアイコンとして消えるのが遅れている状態です。アイコンのところにマウスポインターを合わせると勝手に消えて、


のように1つになるでしょう。

2019年6月17日 @kimipooh

2019年6月7日金曜日

Google Product Experts Sydney Meetup 2019 に参加するぜ! #google-pe-meetup

Google ヘルプコミュニティに関する Google イベント、今年私が招待されたのは Google  シドニーオフィス(オーストラリア)です!シドニーのGoogleオフィスは、かなり大きいとか。楽しみですね! 場所は、ビルモント湾を眺めることができる位置(Google Mapへのリンク)で、周りの見どころも多そうです!

関連情報




シドニーまでのフライト


筆者は関西国際空港(関空)出発になります。
エージェントによると、
  • 関空 - 羽田、羽田 - シドニー
  • 関空 - Changi(シンガポール)、Changi - シドニー
の2パターンを提示してきました。関空でも2日に1度 カンタス航空が直行便だしているようですが、私の日程上はそれを使えず。
提示されたものをみると、いずれも前日出発、当日の朝につくという感じですね。羽田からシドニーへの直行便が 22時しかないのが痛いなぁ。

まぁこの条件なら羽田経由かなぁと思っています。

ビザ必要(ETAS)


通常申請では1週間ほどかかること。旅行代理店によっては提示を求められることもありうるので早めにとっておくのがよいと思います。私の場合には求められました。

Google Product Experts ってなんだろう?


ところで、 Google Product Experts ってなんでしょうか。あまり知られていないかもしれません。

  • Google 製品に関して、Google公式のコミュニティ(Twitter上の Help on Social か、Google ヘルプコミュニティのいずれか)を通じて困っている質問者をサポートすることに情熱を持っている人たち
のうち、
  • その活躍が Googleによって認められて称号(各製品ごとにシルバー、ゴールド、プラチナがある)を付与されたユーザーの総称です。
ただし、いくつかのビジネス用製品については別枠になっている場合もあります。

筆者は、Gmail、Chrome のプラチナ プロダクトエキスパートです。
加えて、G Suite(日本語) もエキスパートになっています。

少なくてもゴールド以上になると、Google の各種イベントに招待されることでしょう。
筆者が招待されたイベントの紹介は、
のほうでまとめています。これまで東京オフィス、Google本社(アメリカ)、シンガポールオフィス(シンガポール)と訪れ、今年はシドニーオフィス(オーストラリア)に行く予定です。費用は基本的に Google 持ちで、様々な人たちと交流し、話を聞き、その国に触れてとても刺激的な体験をすることができました。

なお、それぞれのエキスパートについては、エキスパートの方がブログで紹介されている
を参考にするのがわかりやすいかなと思います。

また 各製品の日本語に関するGoogle 公式コミュニティは、
にまとめています。

Google Product Experts にどうやってなるの?


Google公式のコミュニティ(Twitter上の Help on Social か、Google ヘルプコミュニティのいずれか)上の質問に対して、回答してみてください!

そうすれば、シルバープロダクトエキスパートの候補になります。
あとは Googleヘルプコミュニティコンテンツポリシーをよく読み、回答を続けていくとシルバーの称号を得る可能性が高まります。ようするに困っている質問者を真摯に助けていくとよいということです。

シルバーになり、さらに質の高い回答を提供し続けていけば、その先にはゴールドへの道が自然とひらけてくると思います。ゴールドになれば、まだ世の中に出ていない Google製品を事前にテストする機会を得ることもできますよ!

なぜ Google Product Experts になろうと思ったの?動機は?


筆者の場合には、仕事で G Suite (旧 Google Apps)という Gmailや Googleカレンダー等を統合的に使えるクラウドサービスを管理運用する必要が出てきたためです。管理運用をするためには、そのサービスについて詳しく知っていないと駄目ですよね。

この経緯については
の筆者の旧ブログで公開しています。
Google Top Contributor とは、 2018年10月に Google Product Experts にリニューアルされる前の名称になります。

なお、筆者は Googleに限らず、他のプロダクトでも同様に、自身が管理運用する場合にはそのコミュニティに入って勉強し、そこで得た知識を共有してきました(最近では、Quora, Google, WordPressの3つが主な活動場所になってます)。その一環として Google 製品でも同じことをしたということです。

回答することで、その製品についてより詳しくなっていきます。もし Google の何らかの製品を使っていて、それについて少し人よりも詳しいと思うなら、是非コミュニティで回答してみてください!そしていずれどこかの Googleオフィスでお会いしましょう!(私がそれまでエキスパートでいられればですけどね (^^;)

2019年6月7日 @kimipooh

Redmineのアップグレード(3.4→4.0)とGoogle認証プラグイン

そろそろ 4.0系にアップグレードするかぁと思ってやってみました。
今回はメジャーバージョンアップになります。

関連情報





3.3から3.4系にしたときには特に目新しいものはなかったので、Redmine に関するブログを書くのは久しぶりです。なお 3.4 にしたときに、Google認証プラグイン「redmine_omniauth_google」が動作しなくなっていました。
しかし今回、
というオリジナルをフォークした「redmine_omniauth_google」プラグインを使わせていただき、動くようになりました。

アップグレード


インストール場所:/usr/local/redmime-svn/4.0-stable
Nginxで指定する場所:/usr/local/redmine-svn/redmine (/usr/local/redmime-svn/4.0-stable へのシンボリックリンク)
データベース:redmine34 --> redmine40 への移行

とすると仮定します。

Step 1. Redmine のダウンロード


cd /usr/local/redmine-svn
svn co https://svn.redmine.org/redmine/branches/4.0-stable/

これで 4.0-stable フォルダができます。

Step 2. 設定のコピーと編集


cd /usr/local/redmine-svn/4.0-stable
cp -p  ../3.4-stable/config/database.yml   config/
cp -p  ../3.4-stable/config/configuration.yml   config/
cp -p  ../3.4-stable/config/unicorn.rb    config/

config/database.yml の編集(1箇所)

データベースとして、
database:redmine34
database:redmine40

Step 3. データベースのコピー


phpmyadmin 等で redmine34 のデータベースをエクスポートし、redmine40 というデータベースを新規作成した上で、そこにインポートする。

redmine34 と異なるユーザーに権限を渡した場合には、上記 database.yml のユーザーとパスワードのデータを変更すること。

Step 4. ファイルとフォルダのコピー


cd /usr/local/redmine-svn/4.0-stable
rm -rf files
cp -rp ../3.4-stable/files 

Step 5. Google Auth プラグイン「redmine_omniauth_google」のインストール


cd /usr/local/redmine-svn/4.0-stable
cd plugins
git clone https://github.com/yamamanx/redmine_omniauth_google.git
bundle install

※ bundle install で警告やエラーがでたが、とりあえずそのまま進む。

Step 6. 必要なツール類のインストール(Unicorn等)


cd /usr/local/redmine-svn/4.0-stable
gem install bundler --no-rdoc --no-ri
echo 'gem "unicorn"' >> Gemfile
bundle update
bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

Step 7. A1 テーマのインストールと設定移行


以前から A1テーマを使っていたので、その最新版を入れることにする。
ダウンロードしたものについて

/usr/local/redmine-svn/4.0-stable/public/themes/

に展開する(a1フォルダを入れる)。

/usr/local/redmine-svn/4.0-stable/public/themes/a1/

に入るはず。
以前の a1 テーマにカスタム設定したスタイルシートを移行しておく

cd /usr/local/redmine-svn/4.0-stable
cp -p  ../3.4-stable/public/themes/a1/stylesheets/application.css   public/themes/a1/stylesheets/

どういうカスタマイズをしたかというと

優先度
 今すぐ:紫
 急いで:赤
 高め:オレンジ
 通常と低い:灰色・白
※ただし終了したものは、通常と同じ背景にした上で、文字は青。

という感じ。

Step 8. Redmine を止めて移行する


まずは動作している Redmine 3.4系を停止します。

/etc/init.d/unicorn stop

unicorn のプロセスが残っていたら個別に kill してください。
残っていたら、移行後に redmine 4.0 用の unicornが起動できません。

cd /usr/local/redmine-svn/
rm redmine
ln -s 4.0-stable  redmine

として
/usr/local/redmine-svn/redmine (シンボリックリンク)の実体を
 3.4-stable から 4.0-stable フォルダに切り替えます。

/etc/init.d/unicorn start

で起動すればOK.

STEP 9. Google 認証でログインできるようにする


管理者で Redmine にログインし、「管理 > プラグイン」より、「redmine_omniauth_google」プラグインの設定を行います。

設定に関しては
を参考にしてみてください。
基本的に
  • Client ID: Google Developer Console で発行
  • Client Secret: Google Developer Console で発行 
  • Available domains: 無料版 Gmailなら gmail.com、G Suiteならそれぞれのドメインを入れる感じ。
  • Oauth authentiffication: オンにする
になるはずです。

またプラグインの各種設定については

を参考にしてみるとよいでしょう。

実際にログアウトして、Google 認証ボタン(Login via Google)を押して、Googleログイン画面が出てきて、そこにログインすることで Redmine に登録したユーザー(メールアドレス)でログインできたらOKですね。



ということで Redmine 4.0.3(2019-06-07時点)が入ったのでした。
今回 Redmine の新機能をみると、##チケットID でチケットのタイトルが入ってくれるのは大きいなと思いました。

2019年6月7日 @kimipooh

2019年5月17日金曜日

【G Suite専用】 Google Drive File Stream for Mac で同期できない、アカウントが停止する場合

自分が遭遇して解決するのに苦労したので備忘録としてまとめます。


基本的な対応


  1. システム環境設定 > セキュリティ にて、Google, Inc. に対して「許可」があれば許可する
  2. Google Drive ファイルストリームアプリを終了し、 $HOME/Library/Application Support/Google/DriveFS フォルダをリネームし、アプリを起動する(初期化)
  3. セキュリティ対策ソフトをオフにしてアプリを終了、起動しなおしてみる
    *解決するなら、セキュリティソフトのリアルタイムスキャンに対して
     /Volumes/GoogleDrive/
     /Users/{username}/Google Drive File Stream/
    の2つのフォルダを除外設定する
  4. ターミナルなら「sudo spctl --master-disable」をして、アプリ制限をなくしてアプリを終了、起動しなおしてみる
    *あとで、 sudo spctl --master-enable で設定をもとに戻しておく


までは


あたりにまとめて掲載していますし、他のサイトにも掲載されています。

Google Drive ファイルストリームのネットワーク設定を確認(プロキシ設定)


もしこれでも解決できない場合には、Google Drive ファイルストリームのプロキシ設定の問題かもしれません。筆者は

  • 同期が終わらない
  • DriveFSフォルダを削除すると、ログイン後にアプリが停止する
  • 他のアカウントでログインしようとしたら、プロキシ設定を見直せと警告がでる
という状況あったので、下記のように、設定 > ネットワーク設定のプロキシ設定を変更することであっさり解決できました。



 



2019年5月17日 @kimipooh

2019年5月6日月曜日

GmailのフィルタをCUI ツールで管理してみよう!

大量の Gmailのフィルタをどのように管理していますか。数十程度なら Gmail設定のフィルタから直接管理するほうが早いと思います。でも百を超えてきたら無理っぽい気がします。ではどういう方法があるのでしょうか。

  1. エクスポートしたフィルタデータ(XML)を編集して、インポートする
  2. Gmail APIを利用してフィルタを管理する
  3. ツール側で管理したフィルタ設定を Gmailにインポート(追加)する

あたりが考えられます。
「1」の方法は、エクスポートした XMLファイルをテキストエディタなどで開いて、直接編集することもできます。構造さえ理解できれば、下手なツールをつかうより直接編集したほうが早いだろうと思います。

「2」の方法については、Managing Filters (Gmail API) にあるGoolge Developer ガイドを使って直接プログラミングをするか、何らかのツールをつかうことになると思います。そのツールは少し探した程度では見つけられませんでした。

「3」の方法については、 gmail-yaml-filters が便利かなと思います。

ということで管理といっても、「3」の部分的なものになりますが、その紹介をしてみたいと思います。なお gmail-yaml-filters は プログラミング言語 Python を使ったツールになります。そのため、そこも含めた紹介をします。

参考GUI to manage Gmail filters? (Stackoverflow)

*環境:macOS 10.14.4 

STEP 1.  gmail-yaml-filters (GitHUB) を使えるようにする


1. Python3をインストールする


macOS 10.14 には、python 2.7 系が入っていますが、最近の主流は 3.x 系のため、そちらを使うことにします。

  1. https://www.python.org/downloads/ より macOS 用インストーラーをダウンロードしてインストール。
    ※ 2019年5月6日時点で、Python 3.7.3 が最新版です。
  2. ターミナルを起動して、
      python3 -V 
    コマンドにて、3.7.3 と出てきたらインストール成功しています。

2. pip コマンドへのPATHを通す


pip は、 Python に付随(2.7.9以上、3.4以上)していますが、PATHが通っていません。
macOS であれば

/Library/Frameworks/Python.framework/Versions/3.7/bin

に対するPATHを設定する必要があります。
今回は pip コマンドしか使わないので、すでにPATHが通っているはずの /usr/local/bin へ pip のシンボリックリンクを置くことで代用します。

ターミナルより(以下、一行で書く)
  • ln -s  /Library/Frameworks/Python.framework/Versions/3.7/bin/pip /usr/local/bin/pip
とすると /usr/local/bin/php に本体「 /Library/Frameworks/Python.framework/Versions/3.7/bin/pip」のシンボリックリンクが作成されます。ので /usr/local/bin/ にPATHが通っていれば 
  • pip -V
    pip 19.1 from /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pip (python 3.7)

のように pip コマンドが使えるはずです。

3. gmail-yaml-filters (GitHUB) をインストールする


ターミナルより

  • pip install gmail-yaml-filters

STEP 2. gmail-yaml-filters 用の設定ファイルを作成する


gmail-yaml-filters  の Sample Configuration を参考に作成してみてください。
ここでは my-filters.yaml ファイルに保存することにします。なおタブは使ったらエラーになるので注意。

例1)差出人が hogehoge@sample.com かつ 添付ファイルを含む場合、「Sample」ラベルを付与する
-
  from: hogehoge@sample.com
  match: "has:attachement"
  label: Sample

例2)差出人が、 hogehogeA@sample.com 以外、または hogehogeB@sample.com  以外の場合、「Sample2」ラベルを付与する。
-
  from: 
    any: [-hogehogeA@sample.com,-hogehogeB@sample.com]
    label: Sample2

例3)差出人が、hogehogeA@sample.com、 hogehogeB@sample.com以外の場合、「Sample3」ラベルを付与する。
-
  from: 
    all: [-hogehogeA@sample.com,-hogehogeB@sample.com]
    label: Sample3

*これについては次の書き方もできる
-
  from:
    any:
        -hogehogeA@sample.com
        -hogehogeB@sample.com
  label: Sample3

あるいは

-
  from:  -hogehogeA@sample.com   -hogehogeB@sample.com
  label: Sample3

例1)2)3)をまとめると
my-filters.yaml の中身は次のようになります。
-
  from: hogehoge@sample.com
  match: "has:attachment"
  label: Sample
-
  from: 
    any: [-hogehogeA@sample.com,-hogehogeB@sample.com]
  label: Sample2
-
  from: 
    any:
        -hogehogeA@sample.com
        -hogehogeB@sample.com
  label: Sample3

となります。

STEP 3. Gmailにインポートする


1. Gmailで利用可能な XMLファイルに変換します。


  • gmail-yaml-filters my-filters.yaml  > my-filters.xml

とします。これで


にあるようなXMLファイルがコマンドを実行した場所にできるはずです。
※今回の例の場合、/Users/ユーザー名/ 以下にあるはずです。つまりユーザーのホームディレクトリのところにあるはず。(Macintosh HD > ユーザー > ユーザー名)

2. 既存のフィルタをバックアップします。


念の為、かならずバックアップしておきましょう。


にあるように、Gmailのフィルタ設定で、フィルタをすべて選択して「エクスポート」ボタンを押します。

3. 変換した my-filters.xml をインポート(追加)


1. Gmailのフィルタ設定にある「フィルタをインポート」リンクをクリックします。


2. my-filters.xml を選択すると、下記のようにファイルが選択されます。「ファイルを開く」ボタンをクリックします。

3. すると my-filters.xml に設定したフィルタが出てきます。意図したフィルタになっていることを確認します。確認できたら「フィルタを作成」ボタンをクリックします。

4. 下記のようにフィルタが追加されていることを確認します。



すでにあるものは管理できませんが、このように比較的わかりやすい文法で新たに書き直すことで大量フィルタの管理しやすいかもしれませんね。

2019年5月6日 @kimipooh

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

2019年2月11日月曜日

第一回 ローカル(非公式) Google Meetup in Okayama に参加して

非公式に、Google Product Experts を中心に Google サービスに興味のある何名かが岡山およびオンラインで集まって開催した Meetup です。いつも Meetup っていえば東京や海外だったので、西日本のどこかで出来ないかなぁと何名かのエキスパートと話し合っていたら、岡山に数名エキスパートがいることがわかったので、じゃあ岡山でやるか!というノリで開催されました。



どうせやるならセミナー形式だけじゃもったいないから、ハンズオンをやろうよ!と筆者が提案し、オンラインも交えたハンズオンを行いました。Googleサービスってウェブベースなのでハンズオンもオンラインでできちゃうんですよね!

ミートアップ会場 - Cafe & Bar もくもくガレージ


サイト:https://moku2garage.com/





もくもくと作業をしたり、いろいろな交流を支援しているとのことで、今回のイベントもワンドリンクを注文すれば、会場費無料で開催できました。そういう会場のコンセプトもあり、学生も様々なイベントをしたり、学校帰りによって、もくもくといろいろな作業をしたりしているとのことです。



今回、現地で参加した Google Product Experts のメンバーです!筆者を含めて3名。あとは Google Meet を利用したオンラインでの参加でした。

アイスブレイク - Google Product Expers に参加したのは何故?




いくつかのアイスブレイクネタがありましたが、これが結構盛り上がりました。筆者も含めて、仕事で Googleサービスを管理運用する必要性が出てきたからという理由や、なにか分からないことがあってヘルプフォーラムで質問したことをきっかけにいつのまにか。。というケースなどいくつかありました。

次にハンズオンをしました。実際に全部やると2時間コースになり、他の発表者との兼ね合いもあったので30分コース(最初の1つ目のみ)にしました。

ハンズオン - 実践!Google Apps Script を使ってより便利な Google サービスを体験してみよう! - 筆者 kimipooh




テーマ1 特定条件に一致した Gmail の添付ファイルを Googleドライブへ保存する方法

テーマ2 Google Analytics データを Googleスプレットシートに集約し、PDFでメール添付する方法


   このプレゼンテーションは、Google Apps Scriptを使ってGoogleサービスの利便性を向上する体験をするためのものです。基本的にドキュメントに沿って作業すれば簡単に使えます。

一つ目のテーマは、特定条件(Gmail検索)でGmailに添付されたメールを送信者ごとにGoogle Driveに自動保存するスクリプトです。もし、募集のためのデータを数百添付ファイルとして受け取る場合、添付ファイルを開くのに時間がかかってしまうと思います。そういった場合、本ツールを使えばその運用コストを大幅に軽減できます。

二つ目のテーマは、複数のGoogle Analytics データをまとめてHTMLとPDF形式で自動メール送信する機能です。もし沢山のGoogle Analytics を管理しデータを報告する必要がある場合には、本ツールは役立つと思います。

Google Meet の画面共有で、あちこちの画面の共有を切り替えるのに少し戸惑いましたが、割といけそうな感じでした。

GAS の開発環境を整えよう&Ad−ons開発に挑戦(中)- Fujitaさん



今回主催された Fujitaさん(写真手前)。

第1回 Google ローカルMeetup in Okayama(非公式)を開いた

でタイトルとなる「GAS の開発環境を整えよう&Ad−ons開発に挑戦(中)」や下記の発表資料とともに公開されています。

Google Apps ScriptでスプレッドシートとGoogleカレンダーを連携させて予定一括登録アドオンを作った(Qiita)


中級者向けの内容ということでした。
clasp(https://github.com/google/clasp)を使って、Google Apps Script をローカルで開発してそれを push できる仕組みとのこと。残念ながらプルリクなどの仕組みやバージョン管理はないようで、create/clone/pull/push が可能だということ。自分のスクリプトをローカルで開発したい場合には便利そうですね。

Google Apps Script のアドオン開発について知りたいと思っていたので、公開されるブログが楽しみです。発表時に提示されたのは、Googleスプレットシートに複数のGoogleカレンダーのイベントを列挙して、まとめて各カレンダーに登録するという Google Apps Scriptでした。

Apps Script as Serverless(Googleスライド) comame さん


今回間に合わなかったのですが、高校生(たぶん、日本での最年少 Google Product Expert かも)の comame さんが作成された資料を紹介しておきます。サンプルコードについては後から追加するそうです。Google Apps Script で Webサーバーをやってみようぜというノリのスライドです。

また、


が便利だよ。自分のスクリプトについてエラーログとかいろいろ出してくるからという情報提供あり。私自身は、トリガーがうまく走らない(実施にはコードに問題があった)理由をあれこれ探しているうちに上記にたどり着いた感じですが、改めて示されると便利なツールですね!


岡山電鉄 - 路面電車




岡山駅から会場までは 140円。前の電車に追いつく場合があり、その場合には割と近い位置に止まったりしていました。こういうのは京都の路面電車ではなかったなぁ、珍しいなぁと思いました。


Meetup が終わって・・・倉敷へレッツGOー!




せっかく岡山に来たので、なにか郷土料理が食べたいなーという話になって、倉敷にいって紹介してもらった郷土料理を食べてきました。




商店街を抜けてかなりあるくと、蔵屋敷が立ち並ぶ場所に出くわします。




美術館、そして人力車も走っていて、町並みもすごく良かったです、寒かったですけど。。。




さらにずっといくと、今回夕食を食べた富来屋本舗(口コミ)に到着。



利き酒セットの出てきた3種類のお酒、どれも甘めで飲みやすく美味しかったです。特に風がフルーティな感じで甘さが一番強く、手前の伊七がそれより少し甘めが抑えられていました。料理は、岡山おためしセットという、ちょっとずついろいろな郷土料理を楽しめるコースです。それで 2700円とはリーズナブル!




夜はデートコースとしてなかなか良さそうな感じがしました。白鳥も泳いでますね。

お土産




岡山といえば、桃太郎、桃太郎といえばきびだんご、ですよね!
三色入りを買ったのですが、好評だったのは白のやつだけでした。きびだんごにいろいろ味をつけると、駄目なのかなぁ。




その他、大手まんじゅう、マスカットきびだんご、高瀬舟羊羹、ハタダ栗タルトを購入。イベント用にプロジェクター持ち込んだこともあり、お土産と合わせるとかなり重くて持ってかえるのが大変でした。マスカットきびだんごは意外と美味しく、高瀬舟羊羹はとっても美味しく、ハタダ栗タルトも美味しったです。高瀬舟羊羹がなかなか見つからなかったのですが、岡山駅の新幹線乗り場近くにあるお土産屋さんで見つけました!

以上、いろいろと堪能できましたが、日本酒も美味しいですし、また行きたいですね!

2019年2月11日 @kimipooh