質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.87%

  • Google Apps Script

    622questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • OAuth

    92questions

    OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

  • OAuth 2.0

    79questions

    OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

  • AWS Lambda

    23questions

  • Alexa

    9questions

Google Apps Scriptのアクセス範囲の設定

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 69

yuuoru

score 1

GASとLambdaを使い、音声UI Alexaのカスタムスキル を作成しているのですが、GASのアクセス範囲の制限の仕方でわからなくなってしまったので質問です。
どれも初めて使ったもので、このような質問の場も初めてなので、説明に足りない部分があったら教えていただけると嬉しいです。

疑問点

特定のLambdaからのみGASにアクセスできるようにする方法

作りたいもの

今作っているのは、「Alexa、●●さんの予定教えて」と聞くと、その名前の人の予定をとってきてくれるスキルを作っています。参考にしているのはこのサイトです。http://azure.sios.jp/archives/8450

うまく質問を短文にできないので、流れを追いながら質問させてください。

今やっていること

スキルの簡単な動きの流れとしては、

  1. 話しかける「Alexa、田中さんの予定教えて」
  2. Lambdaに名前が渡される
  3. LambdaがGASを呼ぶ
        // Google Apps Scriptで導入した後に表示されたURL(現在のWebアプリケーションのURL)を
        // 設定します。
        const uri = 'WebアプリケーションのURL' + '?name=' + name;

        // Google Apps ScriptのRest APIにアクセスして、JSONを取得する関数を呼びます。
        getHttp(uri,this);


4. GASが名前をゲットし、カレンダーにアクセスする

function doGet(e) {

  // クエリパラメーター「name」で指定された、Googleカレンダー取得対象のユーザーの名前を取得する。
  var name = e.parameter.name;

  // ユーザーが発話した名前(「〇〇さんの今日の予定を教えて」の〇〇の部分)に紐づく
  // メールアドレスを定義する。Googleカレンダーの予定を取得する際は、
  // そのキーにメールアドレスを指定しなければならないので、この変換が必要になる。
  var mail = {};
  mail['たなか'] = 'たなかのgmailのアドレス';
  mail['やまだ'] = 'やまだのgmailのアドレス';

  // 指定したユーザーのGoogleカレンダーの予定を取得する。
  var cal = CalendarApp.getCalendarById(mail[name]);

  // 現時点のDateを生成する
  var nowDate = new Date();

  // 今日の日付の00:00:00時点のDateを生成する
  var startDate = new Date(nowDate);
  startDate.setHours(0);
  startDate.setMinutes(0);
  startDate.setSeconds(0);

  // 今日の日付の23:59:59時点のDateを生成する
  var endDate=new Date(startDate);
  endDate.setHours(23);
  endDate.setMinutes(59);
  endDate.setSeconds(59);

  // 今日一日のGoogleカレンダーの予定を取得する
  var myEvents=cal.getEvents(startDate,endDate);

  // 今日一日のGoogleカレンダーのJSONを生成する。
  var body = '';
  num = 0;
  var result = [];
  var fullTitle = '';
  var evtTitle = '';

  for each(var evt in myEvents){        
        result[num] = {
          start: convertDate(evt.getStartTime()),
          end: convertDate(evt.getEndTime()),
          place: evt.getLocation(),
          title: evt.getTitle()
        }
        num++;
      }
    }
  }
  return ContentService
      .createTextOutput(JSON.stringify(result))
      .setMimeType(ContentService.MimeType.JSON);
}

function convertDate(date) {

  //moment.jsで日付の形式を合わせる(上記コメントアウトとやってることは一緒。便利)
  return Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm:ss');
}

function toDoubleDigits(num) {
  num += "";
  if (num.length === 1) {
    num = "0" + num;
  }
  return num;     
}

5. GASでカレンダーをもとに予定を検索。JSON形式にしてLambdaに返す
6. Lambdaが受け取ったJSONデータをもとに予定を喋る

と言った感じです。

以上を踏まえてわからないこと

上の3の部分でLambdaがGASを利用できるよう、GASのアプリケーションにアクセスできるユーザーは、全員(匿名含む)にしています。
ですが、このままだと誰でもカレンダーの情報にアクセスできてしまいセキュリティ上よろしくないので、Lambdaから呼ばれた時だけアクセスできる的な制限・認証処理か何かを追加したいと思っています。

最初はアプリケーションにアクセスできるユーザーの範囲を狭くすればいいかな?と思いましたが、全員(匿名含む)でなければAlexa(Lambda)からGASを呼べないとわかり断念。
OAuth認証というものを使えばできるのかと思い調べてみましたが、仕組みや使い方がわからず困っています。

読みづらくなっておりすみません。
どなたかお力添えいただけると嬉しいです。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    GAS ドキュメント作成

    DocumentAppドキュメントを作成したいのですが、パスの指定方法がわかりません。 公式リファレンスで調べたところパスを指定するメソッドが見当たらないのですがどう指定すれば良

  • 解決済

    GASでHTMLファイルの内容がスプレッドシートに送れない

    プログラミング初心者です。 初めて投稿させていただきます。 現在Apps scriptを使ってHTMLファイルから入力された情報をスプレッドシートに書き込むというプログラムを作

  • 解決済

    GASをDRYで書きたい

    前提・実現したいこと Google Apps Scriptを使いグーグルカレンダーの翌日と翌々日の予定を 自分のGmailに送っています。 しかし、このコードには重複があるの

  • 解決済

    GAS フォームからの回答 月別にシートをわけたい

    現在google formを使用してタイムカードとして利用しています。 回答はスプレッドシートに自動的に集計されていますが、このスプレッドシート内に月が変わるごとに新しいシート(

  • 解決済

    GAS⇔html間の値の渡し方

    前提・実現したいこと GASでVBAでいうとユーザーフォームのようなものを作るために、UserForm.htmlを作成し、そこにテキストボックスなどを配置し、その値をGAS側で受け

  • 受付中

    GASを用いた座席表の表示

    前提・実現したいこと 弊社の座席配置は日ごとに変わります。 現状は毎朝、私がオフィスにきて用意してある座席表を張り出しておるのですが、 先輩からGASを用いて、スプレッドシート上に

  • 解決済

    GASのスプレッドシート 配列 高速化

    前提・実現したいこと ここに質問したいことを詳細に書いてください スプレッドシートにランダム関数を最終行まで(約3000個)、一列に並べるスクリプトを作りたい 発生している問題

  • 解決済

    GASでscript内の変数をoptionに入れる方法

    GASのhtmlファイル内でscript を書き、その変数をそのhtmlファイル内の optionのvalue に入れ込みたいです。 <script> var koumoku

同じタグがついた質問を見る

  • Google Apps Script

    622questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • OAuth

    92questions

    OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

  • OAuth 2.0

    79questions

    OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

  • AWS Lambda

    23questions

  • Alexa

    9questions