clasp run できないとき。2018-09-25

# 概要
[GAS のGoogle謹製CLIツール clasp](https://qiita.com/HeRo/items/4e65dcc82783b2766c03) を参考に、claspを導入しました。
push/pullは問題なく使えて非常に便利です。

claspのhelpを見ると `run` というオプションがあり、ターミナルからGASの関数を実行できるようです。
試してみたところいろいろエラーで実行できなかったので、実行できるようにします。

# その前に
2018-09-25現在でinstallされる以下バージョンだとエラーが出て動きません。
GitHubの最新のコードで試しましょう。

```
% clasp -v
1.5.3
```

~~しばらく待てば修正版がリリースされると思います。~~
追記: 1.6以上がリリースされました。それを使えばエラーが出ないのでふつうにnpm installで入れれば問題ないです。

# 初回（`.clasp.json` に `projectId` がない状態）の `run`
初回（`.clasp.json` に `projectId` がない状態）で `run` をすると必要な準備の手順が示されます。その通り設定していきます。

以下の通り、実施すべきことが出力され、`.clasp.json` に `projectId`が追加されます。
英語ではありますが書いてある通りに設定していくのみです。

```
% clasp run FUNCTION_NAME

BASIC SCRIPT EXECUTION API SETUP

Open this link:  https://script.google.com/d/<<<SCRIPT_ID>>>/edit
Go to *Resource > Cloud Platform Project...* and copy your projectId
(including "project-id-")

? What is your GCP projectId? <<<PROJECT_ID>>> # ここにprojectIdを入力します。
1. Enable the Script & Logging APIs for the project:
  a. Open this link: https://console.cloud.google.com/apis/library/script.googleapis.com/?project=<<< PROJECT_ID >>>
      Click ENABLE.
  b. Open this link: https://console.cloud.google.com/apis/library/logging.googleapis.com?project=<<< PROJECT_ID >>>
      Click ENABLE.

2. Create a client ID and secret:
    Open this link: https://console.developers.google.com/apis/credentials?project=<<< PROJECT_ID >>>
    Click Create credentials, then select OAuth client ID.
    Select Other.
    Give the client a name.
    Click Create.
    Click Download JSON for the new client ID: name (right-hand side).

3. Authenticate clasp with your credentials json file:
    clasp login --creds <client_credentials.json>
```

最後にダウンロードした `<client_credentials.json>` を指定してログインし直します。
ログインが終わると、プロジェクト配下に `.clasprc.json` が作成されます。 （`--creds` オプション無しの場合は `$HOME` 以下に `.clasprc.json` が作成されました）

# さらに追加で設定
## 「実行可能APIとして導入」のONにする
今の状態で `run`　しても以下のようなエラーが出るので「実行可能APIとして導入」からポチポチ実行可能なAPIとして導入します。

```
Script API executable not published/deployed.
```

![スクリーンショット 2018-09-21 14.00.39.png](https://qiita-image-store.s3.amazonaws.com/0/3800/125b7f84-a4b1-1a34-1c0f-558928223a9e.png)

**`clasp` から 「実行可能APIとして導入」 する方法があれば教えていただけると嬉しいです**

## scopeの設定
`SpreadsheetApp` などを使っている場合は、scopeを追加する必要があります。
scopeを設定しないと以下のようなエラーが出ます。

```
Error: Local client credentials unauthenticated. Check scopes/authorization.
```

### scopeの設定方法
`clone` したときについてくる `appsscript.json` に設定します。
以下のような設定を追加します。
**`UrlFetchApp` を利用している場合は `https://www.googleapis.com/auth/script.external_request` を追加する必要があります**

```json
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.external_request"
  ]
```

参考: https://github.com/google/clasp/issues/11#issuecomment-358111971

全体のJSON例:

```json:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.external_request"
  ]
}
```

### socpeの設定後、初回の `run`
以下のように質問され、追加のscopeありの状態で承認します。（いつも通り承認用にブラウザが立ち上がるので承認します。）

```
% clasp run FUNCTION_NAME
New authoization scopes detected in manifest:
 [ 'https://www.googleapis.com/auth/drive',
  'https://www.googleapis.com/auth/spreadsheets',
  'https://www.googleapis.com/auth/script.external_request' ]
? Authorize new scopes? Yes
? Use localhost? Yes
```

# `run` する
ここまで終わればあとは `run` できます。

## 実行中
```
% clasp run FUNCTION_NAME
\ Using local credentials: ...（省略）
```

実行中はくるくるしてるので待ちます。

## 実行結果例
returnのないfunctionの場合は `undefined` と表示されます。

```
% clasp run FUNCTION_NAME
Result: undefined
```

return していればその内容が表示されます。

```
% clasp run FUNCTION_NAME
Result: <returnした値>
```

**`Logger.log`の内容は表示されないようです**
追記: [ログを確認したい場合は `clasp logs` を使います](https://qiita.com/abetomo/items/a63dfacde419f44cd8ca)

# まとめ
`clasp run` できました