Google Apps 各種オブジェクトの名、説明などの最大長

Google Appsで作成できるユーザー、グループ、カレンダーリソースについて名称や説明などの最大長などを調べてみました。

  • ユーザー
    設定項目 最大長 使用できない文字
    60文字 < = >
    60文字 < = >
    メールアドレス 64文字 ! ” # $ % & ( ) * + , / : ; < = > ? @ [ \ ] ^ ` { | } ~

     

  • グループ
    設定項目 最大長 使用できない文字
    グループ名 60文字 < = >
    メールアドレス 64文字 ! ” # $ % & ( ) * + , / : ; < = > ? @ [ \ ] ^ ` { | } ~
    説明 4096文字 < = >

     

  • カレンダーリソース
    設定項目 最大長 使用できない文字
    リソース名 100バイト
    リソースの種類 100バイト
    説明 1000バイト

上記の通りオブジェクト毎にまちまちの設定となっていますので注意してください。特にカレンダーリソースについてはなぜか最大長の単位が「文字数」ではなく「バイト」ですのでご注意を。

Googleドキュメント コレクション共有の不思議な仕様

Googleドキュメントでは各ドキュメントやコレクションを他者と共有することができます。
設定はいたって簡単で、対象のドキュメント(コレクション)に対して閲覧権限または共同編集権限を与えるユーザーまたはグループのメールアドレスを指定するだけとなってします。

ところが、コレクションを共有する際、思わぬ落とし穴がありました。
と言うのもGoogleドキュメントの共有コレクションに関するよくある質問には以下の様に記述されています。

コレクションをメーリング リストと共有したり、コレクションを(ウェブ上で、またはエンタープライズ ユーザーの場合はドメイン内で)公開するように設定した場合、このコレクションは他のユーザーのドキュメント リストに自動的に表示されるようになりますか?

いいえ。グループ内のユーザーやドメイン内のユーザーが招待状に記載された URL をクリックしなければ、これらのユーザーのドキュメント リストに共有コレクションは表示されません。コレクションを [公開] に設定すると、全員にコレクションへのアクセス権限が与えられます。ただし、コレクションがユーザーのドキュメント リストに表示されるのは、ユーザーが招待状、メール、チャットで送信されたリンクをクリックして開いた後のみになります。

上記の説明だけでは何のことかよく分からないかと思います。
これのいったい何が問題かを説明したいと思います。

例えばあるコレクションAを特定のグループを対象に閲覧権限を与えていたとします。
当然、閲覧権限を与えられたグループに所属するメンバーはコレクションAを自分のGoogleドキュメント画面内で参照できなければなりません。
が、前述の仕様によりコレクションAが共有された後、各ユーザーがGoogleドキュメントのホーム画面を開いてもドキュメントリストにコレクションAは表示されず、コレクションA内の各種ドキュメントも検索できません。各ユーザーがコレクションAの内容を検索・表示するためには送られてきた招待状に記載されたリンクをクリックして開く必要があるのです。

グループのメンバーが恒久的に不変なのであれば初回の共有設定時に「メールで通知」オプションをチェックし、招待状を送っておけば問題はありません。ですが、グループに新たにメンバーが追加された場合はどうすればよいのでしょうか・・・

答えは「管理者が追加されたメンバーに招待状を送る」ということになります。

海外のフォーラムでも同様の質問がされていたようですが、Googleの社員が「この動作はバグではない」ときっぱりと言い切っています。しかしGoogle Appsの企業での利用を考えた場合、グループのメンバーは組織変更に伴い頻繁に入れ替えが発生するものと考えられます。それを考えるとこの仕様は「不可解」と言わざるを得ません。

Google Product Forums › Google Docs(要ログイン)

なお、この問題が発生するのはコレクションの共有でグループ(またはドメイン)に対して権限を与えている場合のみで、個人に対して権限を与えた場合は招待状のリンクをクリックしなくても対象ユーザーのドキュメントリストに共有されたコレクションが表示されます。

これを利用してグループに新たにメンバーが追加された場合、いったん対象ユーザーに直接コレクションへの権限を与えた後、個人の権限を削除してやることで招待状を送らずとも対象ユーザーのドキュメントリストに共有コレクションを表示させることが可能になります。

Google Document List API 共有されたドキュメントのみを検索する方法

Google Document List APIでドキュメントの検索を行う際、共有されたドキュメントのみを検索したい場合があります。

そのような場合、フィードURLに「-mine」を付け加えます。
例えば、コレクション(フォルダー)の取得を行う場合、フィードURLは以下の様になります。

https://docs.google.com/feeds/default/private/full/-/folder

このフィードURLで取得を実行した場合、実行者が閲覧可能な全てのコレクションが取得されます。

次に、以下の様にURLに「-mine」を付け加えてみてください。

https://docs.google.com/feeds/default/private/full/-/folder/-mine

このフィードURLで取得を実行した場合、返される結果は共有されたコレクションのみとなり、実行者自身がオーナーとなっているコレクションは結果に含まれなくなります。

Google Document List API Ver.3.0でできなくなったこと

現在、Google Document List API Ver.3.0が公開されています。Ver.3.0では旧バージョンではできなかったアップロードドキュメントの検索ができるようになっているなど基本的に機能が向上しているのですが、Ver. 2.0ではできていたことができなくなっている物もあります。

その一つとして「フォルダ名を指定してドキュメントを検索する」ことが挙げられます。

Ver.2.0では以下の様にURLにcategoryパラメータを指定することで特定の名称のフォルダ内のドキュメントを検索することが可能でした。

https://docs.google.com/feeds/documents/private/full?category=collection_name

もっとも上記のクエリでは同名のフォルダが複数存在する場合、その全てが検索の対象となってしまうので微妙と言えば微妙なのですが。

これに対し、Ver.3.0ではこのcategoryパラメータによるフォルダの絞り込みができなくなっています。Ver.3.0において特定のフォルダ内のドキュメントを検索する場合、以下の様に対象フォルダのIDをURLに指定する必要があります。

https://docs.google.com/feeds/default/private/full/folder%3Acollection_id/contents 

IDによる指定なのでピンポイントで特定のフォルダ内を検索できるのですが、当然ながら対象のIDを事前に把握する必要があります。その為旧バージョンのAPIでcategoryパラメータによるフォルダ指定を行っているような実装の場合、実装の修正が必要となってきます。

Google Site でjavascriptを利用する

Google apps の3 月 20 日付 計画的リリース用機能のアップデートでカスタム JavaScript と CSS が追加可能になったらしいのでさっそく試してみました。

参考:http://googleappsupdates-ja.blogspot.jp/2012/03/3-20.html

次の手順でGoogle Site 内でjavascriptやcssを追加することができます。

1. Google Siteの編集画面を開きます
2. 「挿入」から「HTMLボックス」を選択します
3. 入力欄が表示されるので、ここにHTML、javascriptやCSSを入力し保存します

今回は、Googleのヘルプで提供されているサンプルを入力してみました。

Googleのヘルプ:http://support.google.com/sites/bin/answer.py?hl=ja&answer=2500646

4. Siteを保存します。

以上の手順でSiteにjavascriptが仕込まれます。

3の時点では次の画像のようにHTMLボックスという表示で、実際に設定したjavascriptはロードされません。

4でSiteを保存後にjavascriptがロードされます。ロードされると次の画像のように表示されます。

中々便利な機能ですが、いくつか制限があるようです。

  1. iFrameは使用できない
  2. javascriptでscript,imageまたはlinkのタグを生成できない
  3. Document/windowのonload/onready functionは使用できない。(scriptは一番下に書けばdocumentがロードされた後にscriptが読まれる)

この制限を守れば、Google SiteでもjavascriptやCSSを利用できます。

Google document list APIのバッチ処理

Googleドキュメントの各ドキュメントのACLは以下の様にAPIから設定を行う事ができます。

  public void normalOperation() throws Exception{
    //対象のリソースID
    String resourceId  ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    String url = "https://docs.google.com/feeds/default/private/full/" + resourceId
                         + "/acl?send-notification-emails=false;

    //アクセス権限設定対象の配列
    String[] target = {"user_a@example.com","user_b@example.com"};

    for(String email : target){
      AclEntry entry = new AclEntry();
      entry.setRole(new AclRole("reader"));
      entry.setScope(new AclScope(AclScope.Type.USER, email));

      service.insert(new URL(url), entry);
    }
  }

上記の例では配列で指定された”user_a@example.com”と”user_b@example.com”の二人のユーザーに閲覧権限を与える処理となっています。

では上記と同様の処理で、設定対象が何十人もいる場合はどうなるでしょうか。そのような場合、上記の例では人数分のHTTPリクエストが発生する事になってしまいます。このような場合はバッチ処理を行う事によりHTTPリクエストの回数を削減し、クライアントの帯域幅を抑えることができます。

上記の例をバッチ処理化すると以下の様になります。

  public void batchOperation() throws Exception{
    //対象のリソースID
    String resourceId  ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    //バッチ処理用のACL(通常のURLの末尾に「/batch」を付加する)
    String url = "https://docs.google.com/feeds/default/private/full/" + resourceId
                         + "/acl/batch?send-notification-emails=false;

    //アクセス権限設定対象の配列
    String[] target = {"user_a@example.com","user_b@example.com"};

    AclFeed reqFeed = new AclFeed();
    for(String email : target){
      AclEntry entry = new AclEntry();
      entry.setRole(new AclRole("reader"));
      entry.setScope(new AclScope(AclScope.Type.USER, email));

      BatchUtils.setBatchId(entry, email);
      BatchUtils.setBatchOperationType(entry, BatchOperationType.INSERT);
      reqFeed.getEntries().add(entry);
    }
    service.batch(new URL(url), reqFeed);
  }

APIでGoogleのエディションを判定する方法

Google Appsを利用するアプリケーションを作成する場合、Google Appsが有償版か無償版かでロジックを振り分けたい場合があります。

そのような場合、Google Admin Settings APIを使ってエディションを取得するのですが、このAPIは従来有償版のみに提供されていたAPIでした。
しかし、昨年末Google Appsの開発者ブログでAdmin Settings APIを含むいくつかのAPIが全エディションで利用できるようになったとのアナウンスがありました。

詳細は以下。

管理 API がすべての Google Apps エディションで

と言うことで、早速試してみます。まずはサンプルコードです。


public void getEdition() throws Exception{
String adminEmail = "admin@example.com";
String password = "administrator";
String domain = "example.com";
String appName = "GetEditionSample";

DomainSettingsService service
= new DomainSettingsService(adminEmail, password, domain, appName);

System.out.println("Edition[" + domain + "]: " + service.getDomainEdition());
}

ドメイン「example.com」でGoogle Appsの有償版を利用している場合、上記のコードを実行すると以下の様な結果が返されます。

Edition[example.com]: premier

ここまではOKですね。では次にドメイン「example.com」でGoogle Appsの無償版を使っている場合はどうなるのか試してみます。過去においては無償版に対してこのコードを実行した場合は403エラーが返されていたのですが、現在では以下の様な結果が得られるハズです。

Edition[example.com]: standard

では、実行。

Exception in thread "main" com.google.gdata.util.ServiceForbiddenException: Domain cannot use API <HTML> <HEAD> <TITLE>Domain cannot use API</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> <H1>Domain cannot use API</H1> <H2>Error 403</H2> </BODY> </HTML>     at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:597)     at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:563)     at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:552)     at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:530)     at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:535)     at com.google.gdata.client.Service.getEntry(Service.java:1352)     at com.google.gdata.client.GoogleService.getEntry(GoogleService.java:567)     at com.google.gdata.client.Service.getEntry(Service.java:1278)     at com.google.gdata.client.appsforyourdomain.AppsForYourDomainService.getEntry(AppsForYourDomainService.java:118)     at com.google.gdata.client.appsforyourdomain.adminsettings.DomainSettingsService.getDomainEdition(DomainSettingsService.java:212)     at mywork.AdminSettingsApiSample.getEdition(AdminSettingsApiSample.java:94)     at mywork.AdminSettingsApiSample.main(AdminSettingsApiSample.java:70) 

・・・
・・・・・・
・・・・・・・・・

あれ?

期待した結果が得られない・・・うーーん・・・何でか分からず悩んでいたのですが、ひょんなことから原因が分かりました。
Admin Settings APIを利用するためにはGoogle Apps管理画面から「provisionning APIを有効にする」のチェックを入れておく必要があります。

そんなのどこにも書いてないじゃん・・・orz

ま、とにかく上記のチェックを入れるとちゃんと無償版でも正しい結果が得られました。

GoogleドキュメントのAPIによる共有権限設定

Googleドキュメントの各コレクションやドキュメントに対する共有権限をAPIで設定する際にサンプルやヘルプでは不明な点があったので実際に試してみました。

ドメインの全ユーザーが閲覧可能にする

対象をドメインの全ユーザーが閲覧可能にするにはコードは以下の様になります。

DocsService service = new DocsService("Docs List API Sample");
String username = "admin@example.com";
String password = "xxxxx";

//ACL設定対象のリソースID
String resourceId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

service.setUserCredentials(username, password);
String url = "https://docs.google.com/feeds/default/private/full/" + resourceId + "/acl;
AclEntry entry = new AclEntry();
entry.setRole(new AclRole("reader"));
entry.setScope(new AclScope(AclScope.Type.DOMAIN, "example.com"));
service.insert(new URL(url), entry);

上記例ではドメイン「example.com」の全ユーザーがresourceIdで指定されたドキュメントへの閲覧権限が与えられる事になります。

限定公開にする

全ドメインユーザーに共有されている対象を限定公開(指定されたユーザーに対してのみ共有)したい場合は以下の様にドメイン全体に対する権限を削除してやる必要があります。

DocsService service = new DocsService("Docs List API Sample");
String username = "admin@example.com";
String password = "xxxxx";

//ACL設定対象のリソースID
String resourceId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

String url = "https://docs.google.com/feeds/default/private/full/"
  + resourceId + "/acl/domain:example.com";
service.delete(new URL(url));

フォロー

新しい投稿をメールで受信しましょう。

%d人のブロガーが「いいね」をつけました。