Google SheetsへLookerのデータを出力する方法

LookerはGoogle Sheetsへ直接データを出力することが可能です。
本記事において、よりスムーズに出力するための追加機能をご紹介します。(本記事は、弊社[ヘルプドキュメント](https://help.looker.com/hc/en-us/articles/360001288508-Exporting-Data-to-Google-Sheets)に記載内容の抄訳となります)
##Looker側の設定##
Lookerのレポート(以降、*Look*と呼びます)を出力する方法は、こちらの[ガイド](https://docs.looker.com/sharing-and-publishing/publishing-looks-with-public-urls#importing_to_google_or_excel_spreadsheets)に記載がありますが、以下のステップとなります:
1. Lookページにてギアアイコンをクリックし、"設定の編集"を選択します
2. Public AccessをONに変更します
3. 変更を保存します
<a href="https://qiita-image-store.s3.amazonaws.com/0/394509/1e4a441e-c31c-b2c1-bdcb-21a7fd314b54.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/394509/1e4a441e-c31c-b2c1-bdcb-21a7fd314b54.png" height="400"></a>
4. Google Spreadsheet用のURLをコピーします
5. Google Spreadsheetのデータを反映したい左上のセルにURLを貼り付け、エンターキーを押します
<a href="https://qiita-image-store.s3.amazonaws.com/0/394509/76cb7928-926c-b33b-5ca2-7e6e196bcf47.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/394509/76cb7928-926c-b33b-5ca2-7e6e196bcf47.png" width="400"></a>

##インポート機能の改良##
上記のURLには、Google Sheetsの組み込みImportXML機能が含まれています。ロード時間が長くなってしまうケースがあるため、以下のようなlookerFetchData関数を作成いただくことも可能です。

```javascript

function lookerFetchData(url) {
  url = url.replace(/(\/\w+\.)txt|html|csv|gsxml(\?.*)?/, "$1csv$2");
  var csvString = UrlFetchApp.fetch(url).getContentText();
  var dataIn = Utilities.parseCsv(csvString);
  var dataOut = dataIn.map(function(row) {
    return row.map(function(val) {
      if (val == '') return '';
      var dateMatch = /(\d{4})\-(\d{2})-*(\d{0,})/.exec(val);
      while (dateMatch != null) {
        // first index is full match
        return new Date(dateMatch[1], dateMatch[2] - 1, dateMatch[3] || 1);
      };
      if (val.match(/[-a-zA-Z]/)) {
        return String(val)
      };

      val = val.replace(/[^\d.]/g, '');

      if (val.match(/[0-9.]+/))
        return Number(val);

      return Number(parseInt(val));
     });
  });
  return dataOut;
}
```

Google Sheets内でこのスクリプトを利用するには:
1. Sheetのメニューから*ツール > スクリプト・エディタ*を開きます
2. 新規プロジェクトを作成します
3. 上記スクリプトをスクリプト・エディタへ貼り付け保存します(自由に名前をつけて構いません)。スクリプト・エディタを閉じて、Google Sheetを再読込します。
4. `ImportXML`関数を`lookerFetchData`に置き換えます。
##自動更新スクリプト##
最終的に、Google Sheetが自動的にリフレッシュし、Lookerから自動的にデータを読み込むようにするために、以下のスクリプトを利用することも可能です:

```javascript

function onOpen(){
  var e=SpreadsheetApp.getActiveSpreadsheet();
  var t=[{name:"Refresh This Sheet",functionName:"Refresh"},{name:"Refresh All Sheets",functionName:"RefreshAll"}];
  e.addMenu("Looker",t)
}

function onInstall(e){
  onOpen(e)
}
function Refresh(e){
  var t=SpreadsheetApp.getActiveSheet();
  if(typeof e!=="undefined"){
    t=e
  }
  var n=t.getDataRange();
  var r=find("ImportXML",n);
  var y=find("lookerFetchData", n);
  for(var i=0;i<r.length;i++){
    r[i].setValue(r[i].getFormula().replace(/(.gsxml[^"]*)"/,".gsxml?apply_formatting=true&apply_vis=true&refresh="+(new Date).getTime()+'"'))
  }
  for(var i=0;i<y.length;i++){
    y[i].setValue(y[i].getFormula().replace(/(.html[^"]*|.txt[^"]*)"/,".txt?apply_formatting=true&apply_vis=true&refresh="+(new Date).getTime()+'"'))
  }
}
function RefreshAll(){
  var e=SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for(var t=0;t<e.length;t++){
    Refresh(e[t])
  }
}
function find(e,t){
  var n=t.getFormulas();
  var r=[];
  for(var i=0;i<n.length;i++){
    for(var s=0;s<n[i].length;s++){
      if(n[i][s].indexOf(e)>-1){
        r.push(t.getCell(i+1,s+1))
      }
    }
  }
  return r
}
```

これを有効にするための手順は、Import関数の場合と同様です。
1. Sheetのメニューから*ツール > スクリプト・エディタ*を開きます
2. 新規プロジェクトを作成します
3. 上記スクリプトをスクリプト・エディタへ貼り付け保存します(自由に名前をつけて構いません)。スクリプト・エディタを閉じて、Google Sheetを再読込します。