LoginSignup
2
4

More than 3 years have passed since last update.

スプレッドシートをCSV化してCloud FunctionsでCloud Storageにアップロードする

Last updated at Posted at 2020-05-14

目標

APIのエンドポイントを叩いたら特定のスプレッドシートのデータをCSVに書き出してストレージに保存する。
※公開しても問題のないデータの前提

使うもの

  • Google Apps Script
  • Python
  • Cloud Storage
  • Cloud Functions

手順

1. スプレッドシートをWebアプリケーションとして公開する

スプレッドシートのツールバーから「ツール」→「<>スクリプトエディタ」を選択してGoogle Apps Scriptのエディタを開きます。
screenshot-script.google.com-2020.05.14-18_55_28.png

既存のコードを削除して以下のコードを貼り付けます。

コード.gs
function doGet(e) {
  var output = ContentService.createTextOutput(createCSV());
  output.setMimeType(ContentService.MimeType.TEXT);
  return output;
}

function createCSV() {
  var sheetName = 'シート名';
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var values = sheet.getDataRange().getValues();
  var csv = values.join('\n');
  return csv;
}

ツールバーの「公開」→「ウェブアプリケーションとして導入...」をクリックします。

プロジェクト名を聞かれるので適当な名前を付けて「OK」をクリックします。

設定を聞かれるので「Execute the app as:」を「Me(メールアドレス)」、「Who has access to the app:」を「Anyone,even anonymous」に設定して「Deploy」をクリックします。
screenshot-script.google.com-2020.05.14-18_46_39.png

以下の画面が表示されるので、「Current web app URL」に記載のURLにアクセスしてスプレッドシートのデータがCSVの形で表示されれば成功です。
screenshot-script.google.com-2020.05.14-18_50_52.png

このURLは後で使うので控えておいてください。

2. Cloud Storageにオブジェクト作成の権限を付与する

※細かい設定の説明は省きます。

「IAMと管理」の「サービスアカウント」を開き、「サービスアカウントのを作成」をクリックしてサービスアカウントを作成します。

「Storage」を開き、「バケットを作成」をクリックしてバケットを作成します。

バケット一覧の画面でバケットの右のメニューから「バケットの権限を編集」→「メンバーの追加」をクリックします。

新しいメンバーにさきほど作成したサービスアカウントを追加し、ロールを選択から「Cloud Storage」→「ストレージオブジェクト管理者」を選択して「保存」をクリックします。

screenshot-console.cloud.google.com-2020.05.14-19_42_16.png

3. Cloud FunctionsにCSVをアップロードするスクリプトを配置する

「Cloud Functions」を開き、「関数を作成」をクリックします。

「未承認の呼び出しを許可する」にチェックを入れます。

screenshot-console.cloud.google.com-2020.05.14-19_50_20.png

ランタイムに「Python 3.7」を選択します。
「MAIN.PY」と「REQUIREMENT.TXT」に以下のコードを貼り付けます。

main.py
import sys
import csv
import codecs
import requests
import os
import tempfile

from google.cloud import storage


def main(request):
    # Spreadsheet Web application URL
    url = '1.で表示されたURL'

    # Cloud Storage
    bucket = 'バケット名'
    dir = 'ディレクり名'
    fileName = 'csv名'

    # get data
    r = requests.get(url)
    assert r.status_code == requests.codes.ok, "can't read spreadsheet"  # pylint: disable=no-member

    # make file
    _, temp_local_filename = tempfile.mkstemp()
    with codecs.open(temp_local_filename, 'w', 'utf_8') as f:
        f.write(r.text)

    # upload file
    client = storage.Client()
    bucket = client.get_bucket(bucket)
    blob = bucket.blob(f'{dir}/{fileName}')
    blob.upload_from_filename(filename=temp_local_filename)
    return "success"
REQUIREMENT>TXT
astroid==2.4.0
autopep8==1.5.2
cachetools==4.1.0
certifi==2020.4.5.1
chardet==3.0.4
colorama==0.4.3
google-api-core==1.17.0
google-auth==1.14.1
google-cloud==0.34.0
google-cloud-core==1.3.0
google-cloud-storage==1.28.0
google-resumable-media==0.5.0
googleapis-common-protos==1.51.0
idna==2.9
isort==4.3.21
lazy-object-proxy==1.4.3
mccabe==0.6.1
protobuf==3.11.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycodestyle==2.5.0
pylint==2.5.0
pytz==2020.1
requests==2.23.0
rsa==4.0
six==1.14.0
toml==0.10.0
urllib3==1.25.9
wrapt==1.12.1

「実行する関数」を「main」にして「作成」をクリックします。

screenshot-console.cloud.google.com-2020.05.14-19_51_28.png

後は関数名をクリック→「トリガー」タブに書いているURLを叩いてCSVが書き出されれば成功です。

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4