Google Drive에 있는 구글 스프레드 시트(Google Sheets)를 엑셀 파일로 다운받는 Python 스크립트이다.

대부분은 Google Drive API 공식 사이트에서 가져온 코드이며, Credential 경로를 스크립트를 실행하는 디렉토리로 변경하였고, 파일 내용을 읽기 위해 Scope를 metadata.readonly에서 readonly로 변경하였다. (Scope에 대한 자세한 정보는 여기에서 확인할 수 있다.)

Ubuntu 16.04, Python 3.5.2 환경에서 테스트하였다.

사용방법

스크립트의 인증절차를 진행하기 위해 여기에 나와있는 Step 1을 완료한다.

아래 코드에서 FILE_ID값(27번 줄)을 다운받고자 하는 파일의 실제 file id 값으로 바꿔준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /usr/bin/env python3

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import io
from apiclient.http import MediaIoBaseDownload

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

CREDENTIAL_DIR = './credentials'
CREDENTIAL_FILENAME = 'drive-python-quickstart.json'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Drive File Export Example'
SCOPES = 'https://www.googleapis.com/auth/drive.readonly'

FILE_ID = 'your file id'
EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
EXPORTED_FILE_NAME = 'exported_file.xlsx'

def get_credentials():
    credential_dir = CREDENTIAL_DIR
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, CREDENTIAL_FILENAME)

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else:
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v3', http=http)

    request = service.files().export_media(fileId=FILE_ID, mimeType=EXCEL)
    fh = io.FileIO(EXPORTED_FILE_NAME, 'wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print('Download %d%%.' % int(status.progress() * 100))


if __name__ == '__main__':
    main()

이 스크립트를 터미널을 통해 원격 서버에서 실행해야하는 경우에는 처음 인증을 할 때 아래와 같이 --noauth_local_webserver 옵션을 지정해서 실행해야한다.

$ ./export_example.py --noauth_local_webserver

클라이언트의 웹브라우저를 통해 인증 절차를 진행할 수 있는 URL이 표시되는데, 터미널에서 보통은 URL을 인식해서 마우스 클릭을 지원하므로 주소를 클릭해서 인증을 진행한다. 권한 요청을 허용하고나면 승인 코드가 나오는데 이 코드를 다시 터미널에 붙여넣는다.

인증이 완료되면 파일 다운로드가 진행된다.

mail 명령어를 사용해서 커맨드 라인에서 메일을 보낼 수 있다. 배포판 버전에 따라 옵션이 다르므로 주의해야한다.

Ubuntu 12.04에서는 아래 명령어로 메일을 보낼 수 있다.

$ mail -s "mail test" -S replyto="replyto@domain.com" to@domain.com < /dev/null
  • -s: 제목을 지정한다.
  • -S: 변수값을 지정한다. 여기서는 replyto 변수를 replyto@domain.com로 지정하였다. 이렇게 하면 수신자가 ‘회신’을 눌렀을 때, 원래 메일의 From 주소가 아닌 이 주소로 To 주소가 설정된다.

body 부분은 표준 입력으로 전달하는데 여기서는 /dev/null을 표준 입력으로 지정했으므로 body가 비어있는 메일이 가게된다.

mail is a utility that can sends an email from command line. In Ubuntu 12.04, the following command sends an email to to@domain.com with empty body.

$ mail -s "mail test" -S replyto="replyto@domain.com" to@domain.com < /dev/null
  • -s: specify subject on command line.
  • -S: set variable. In this case, a variable replyto is set to replyto@domain.com. When a recipient of this email clicks ‘Reply to’ button on their client, the client will set To address to replyto@domain.com, instead of From address from the original mail.

(Note: options vary depending on the version of Ubuntu distribution.)

mail reads its body from standard input. An email sent by this command has empty body because /dev/null is used as body.

OpenCV Quick Start 페이지에서 Installation in Linux를 보면서 설치를 진행했다.

Required Packages에 Git, Python 2.6 or later 같은 것들도 요구하고 있는데, 이런 건 이미 설치되어있는 것들이라 설치 패키지에 넣지 않았다.

$ sudo apt install cmake libgtk2.0-dev pkg-config
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev

여기서도 build-essential, pkg-config는 이미 설치되어 있다고 나왔던 것같다.

나머지는 설명대로 진행하여 sudo make install까지 성공적으로 실행하였다.

안드로이드 개발과 관련된 문서들이 따로 있는데, 혹시 빌드하는 소스가 다른지 확인이 필요하다.

처음 계획은 PC에서 기본적인 사용법을 익히고, 크로스컴파일 삽질을 거쳐 JNI로 가져다 쓰는 것.

코드가 다르거나 Capability가 다르면 처음부터 NDK로 크로스컴파일 해야함.

구글 스프레드시트에서 행 삽입 단축키

구글 스프레드시트에서 새로운 행을 반복적으로 추가할 일이 종종 있는데, 찾아보니 단축키가 있었다. Ctrl + Option + i 누르면 삽입 메뉴가 나오고 r(위에 삽입) 또는 w(아래에 삽입)을 누르면 된다.