×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


Googleを追いかけろ!

.

チュートリアル 中級者 読書リストからスプレッドシートを作成する

  • 未読URLリストからタスクアイテムを作成するための同期関数を作成するGoogle APIの統合

チュートリアル 中級者/目次 参照ページ(Goolge)


WWW を検索 Googleを追いかけろ! を検索


シンプルな読書リストの作成 - GoogleAPIと統合

このチュートリアルは”リーディング・リスト・アプリケーション”の構築によって”Google Apps Script”による”Google APIs”の使い方を学ぶもので、 以下の内容を含みます。

  • ”Gmail”からアクセス可能なタスクリストとスプレッドシートに保存されているURLを同期させる。
  • タスクリストでは読みやすいようにURLの省略化を行う。
  • タスクリスト中のタスクを完了としてチェックした時、これに応じたスプレッドシート内のタスクを終了チェックする。
GoogleのAPI群は機械可読形式の”Discovery Service” を通じてユーザーに公開されています。
”Apps Script”チームは”Google APIs”チームと共同でスクリプトやAPPSを統合するための 便利な方法を日々構築しています。
このため、”Google Apps Script”の利用がより豊かなものになり、 今までは不可能だった新たなマッシュアップや統合ができるようになりました。
このセクションではこれらの新しいサービスを利用することから始めて、日常で使えるちょっとおもしろいスクリプトを作ってみます。

ネットサーフィンをしていると後日のために取り敢えず保存しておきたいと思う記事によく出逢うことがあります。
こんなときスプレッドシートによる便利な”リーディングリスト”で管理すると良いでしょう。 ”Gmail”ではすでにタスクやステータスのチェックが簡単にできるので、これを利用します。
これまでのタスクでは、長いURLの貼り付けが省略されたり、扱いにくいことがありました。そこで、 これらのURLへのリンクを省略化したタスクリストにして、スプレッドシートのURLと同期させるappを開発してみます。 また、このタスクが完了した時、両方の場所で表示された完了ステータスが確かめられるようにしてみます。
製作まではおよそ30分です。

準備として

セット・アップ

先ず、”URLs”,”Done”,”Reading List Name”,”Developer Reading”の各カラムを持つスプレッドシートを用意します。
第一列の”URLs”列(A2、A3・・)の各セル毎に一個のURLを入力しておきます。
セットアップ
それでは、”ツールバー”から”スクリプトエディター”を開いてアプリケーションを動かす準備をしましょう。

Google API サービスを利用できるようにする

このアプリケーションのために”Url Shortener API”と”Tasks API”を利用します。スクリプトでこれらのAPIを使用するには ”Google APIs Services”のダイアログで設定します。”スクリプト・エディター”のFile >> Use Google API servicesへと辿ります。
Google APIs Servicesダイアログ
ダイアログでプロジェクト名を促されるので”Reading List”という名で保存しましょう。
プロジェクトの保存
OKをクリックすると”Google APIs Services”のダイアログが表れます。我々が使うのは”Tasks”と”UrlShortener”の2つのAPIです。 初期設定で名前が選ばれていれば問題ないのでそれらを変更しないようにします。トグルボタンを操作して”off”から”on”にして下さい。
APIの設定
利用しようとしているAPIは”Google APIs Console”で制御されています。APIを正しく動作させるためには”Developer Key”を取得しなければなりません。 キー取得のための”APIs console”上でプロジェクトを作成します。ダイアログにある”Google APIs Console”へのリンクをクリックします。 あなたのAPPが登録されるので、”API Access”タブをクリックして、Googleから送られてきたダイアログ上の”API key”をコピーしてください。
Deveroper Keyの取得
新規の”API Key”を”Google APIs Services”のダイアログ中の”API Key”フィールドに貼り付けます。
API Keyの貼り付け
両方のAPIが使えるようになったところでコンソールプロジェクトを作成し、appを書くためにキーをコピーしておきましょう。

Appを書く

はじめにやることはスプレッドシート内から取り出した”reading list”を読み取るコードから書き始めることです。
function synchronize() {
  var sheet = SpreadsheetApp.getActiveSheet();
 
  // Get the reading list name from the spreadsheet
  var readingListName = sheet.getRange(1, 4);
  
  // Create a new Tasks list to hold our reading list
  var listTitle = readingListName.getValue();
  Logger.log("Creating reading list with name: " + listTitle);
  var titleToInsert = Tasks.newTaskList().setTitle(listTitle);
  var readingListObj = Tasks.Tasklists.insert(titleToInsert);
  
  // Grab the ID assigned to the reading list, we’ll need it later
  readingListId = readingListObj.getId();
  
  Logger.log("Using reading list: " + readingListId);
}
もし、このままこのコードを実行すれば、スプレッドシートから”リーディングリスト”のタイトルを読み出して、 ファンクションを実行すたびに新規の”リーディングリスト”を作成してくれます。
もちろん欲しいのは、同期した時にいつでも同じ”リーディングリスト”であって、新規のリストではありません。

動作を保存する

同期関数を実行するたびに新規の”リーディングリスト”が作成されないように、”リーディングリストID”をスプレッドシート内のコメントとして 保存することにします。関数の後の各呼び出しでIDを読み返して利用します。 この方法でメタデータをアプリケーションのどこかに蓄積しておくことにします。
function synchronize() {
  var sheet = SpreadsheetApp.getActiveSheet();
 
  // Get the reading list name
  var readingListName = sheet.getRange(1, 4);
  
  // Read the id of the saved reading list (if any) from the comment
  var readingListId = readingListName.getComment();
  if (readingListId === "") {
  
    // Create a new Tasks list to hold our reading list
    var listTitle = readingListName.getValue();
    Logger.log("Creating reading list with name: " + listTitle);
    var titleToInsert = Tasks.newTaskList().setTitle(listTitle);
    var readingListObj = Tasks.Tasklists.insert(titleToInsert);
    
    // Grab the ID assigned to the reading list and save it as a comment
    readingListId = readingListObj.getId();
    readingListName.setComment(readingListId);
  }
  
  Logger.log("Using reading list: " + readingListId);
}

URLに同期させる

つぎはURLの反復処理です。つまり短縮化と新規の挿入および現存データの更新をします。いまあるファンクションに下のコードを 付け加えましょう。
// Fetch the list of URLs to keep synchronized
var articleUrls = SpreadsheetApp.getActiveSheet().getRange("A2:A");
for (var rowNum = 0; rowNum < articleUrls.getNumRows(); rowNum++) {

  // Limit our range to a single cell containing a URL
  var oneUrlCell = articleUrls.offset(rowNum, 0, 1, 1);  
  if (oneUrlCell.getComment() === "") {
    // This is a new URL that needs to be shortened/inserted
    var urlText = oneUrlCell.getValue();
    if (urlText !== "") {
      // Shorten the URL
      Logger.log("Adding task for url: " + urlText);
      var toShorten = UrlShortener.newUrl().setLongUrl(urlText);
      var shortened = UrlShortener.Url.insert(toShorten);
      
      // Insert the shortened URL into our reading list
      var taskToInsert = Tasks.newTask().setTitle(shortened.getId());
taskToInsert.setNotes(urlText);
      var newTask = Tasks.Tasks.insert(taskToInsert, readingListId);
      
      // Save the new ID as our comment.
      oneUrlCell.setComment(newTask.getId());
    }
  } else {
    // This URL has already been inserted, update the status
    var existingTask = Tasks.Tasks.get(readingListId, oneUrlCell.getComment());
    if (existingTask.getStatus() === "completed") {
      var absRowNum = oneUrlCell.getRow();
      var completedCell = sheet.getRange(absRowNum, 2);
      completedCell.setValue("Yes");
    }
  }
}

(注);タスクがある時間経過した後に削除されている場合は、タスクを表示するために使用されるIDのエラーが返されます。 もしこのコードを利用するならば、リストから削除されたタスクを移動させるか“Not Found”のエラーを正確に 操作するように修正します。

これでコードが完成しました。スプレッドシートにはテストができるようにサンプルURLが入力してあります。 まだでしたら入力して次の点を確認します。

  1. ”synchronize()”ファンクションを実行してこれが”タスクリスト”にどのように反映されているか確かめます。
  2. 新規のURLを追加した時に現存のリストがどのようになるか確認します。
  3. タスク完了をマークして”synchronize()”を実行した時のスプレッドシートの変化を確認します。

締めくくり

”Google APIs services”を利用したはじめての”app”が完成しました。 他にも利用可能なAPIがたくさんあるので気軽に利用してください。今後もたくさんのAPIをリリースする予定です。

完成版スクリプト

function synchronize() {
  var sheet = SpreadsheetApp.getActiveSheet();
 
  // Get the reading list name from the spreadsheet
  var readingListName = sheet.getRange(1, 4);
  
  // Read the id of the saved reading list (if any) from the comment
  var readingListId = readingListName.getComment();
  if (readingListId === "") {
  
    // Create a new Tasks list to hold our reading list
    var listTitle = readingListName.getValue();
    Logger.log("Creating reading list with name: " + listTitle);
    var titleToInsert = Tasks.newTaskList().setTitle(listTitle);
    var readingListObj = Tasks.Tasklists.insert(titleToInsert);
    
    // Grab the ID assigned to the reading list and save it as a comment
    readingListId = readingListObj.getId();
    readingListName.setComment(readingListId);
  }
  
  Logger.log("Using reading list: " + readingListId);
  
  // Fetch the list of URLs to keep synchronized
  var articleUrls = SpreadsheetApp.getActiveSheet().getRange("A2:A");
  for (var rowNum = 0; rowNum < articleUrls.getNumRows(); rowNum++) {
  
    // Limit our range to a single cell containing a URL
    var oneUrlCell = articleUrls.offset(rowNum, 0, 1, 1);  
    if (oneUrlCell.getComment() === "") {
      // This is a new URL that needs to be shortened/inserted
      var urlText = oneUrlCell.getValue();
      if (urlText !== "") {
        // Shorten the URL
        Logger.log("Adding task for url: " + urlText);
        var toShorten = UrlShortener.newUrl().setLongUrl(urlText);
        var shortened = UrlShortener.Url.insert(toShorten);
        
        // Insert the shortened URL into our reading list
        var taskToInsert = Tasks.newTask().setTitle(shortened.getId());
        taskToInsert.setNotes(urlText);
        var newTask = Tasks.Tasks.insert(taskToInsert, readingListId);
        
        // Save the new ID as our comment.
        oneUrlCell.setComment(newTask.getId());
      }
    } else {
      // This URL has already been inserted, update the status
      var existingTask = Tasks.Tasks.get(readingListId, oneUrlCell.getComment());
      if (existingTask.getStatus() === "completed") {
        var absRowNum = oneUrlCell.getRow();
        var completedCell = sheet.getRange(absRowNum, 2);
        completedCell.setValue("Yes");
      }
    }
  }
}




    * チュートリアル 中級者/目次
    1. スプレッドシートの読み取り - JavaScript オブジェクトを利用してシート内のデータ構造を読み取る
    2. スプレッドシートへの書き込み - シートに構築されたデータを読み取り他のシートへ移植
    3. トーナメント表の作成 - バスケットのトーナメント表をスプレッドシートで作成
    4. Google Site の作成 - Gmail や Calendar からデータを収集してサッカーチーム用のサイトを作成
    5. Docs Listとの連携を図る - Docs List上のファイル検索やCSVファイルのインポート(エクスポート)
    6. Google Sites にApps Script を埋め込む - Google SitesにGoogle Apps Scriptを実装する
    7. デバッガーの利用 - YouTubeのVideoによる Tutorial
    8. Google Sites に Google DocList を埋め込む - ファイルキャビネットとリストページを利用してフォルダーを作成する
    9. 読書リストからスプレッドシートを作成する - 未読URLリストからタスクアイテムを作成するための同期関数を作成するGoogle APIの統合
    10. Gmail受信トレイの統計レポート - Gmail内の毎月の送受信とそのトップ5の統計情報
    -- チュートリアル 中級者 2-9. 読書リストからスプレッドシートを作成する : end -- 2011/10/30