flutter google sheet API (2/3) - 2. gsheets package 연결 후 추가 테스트

💜Dabo (개발자 다보)·2021년 9월 16일
3

flutter Google Sheets

목록 보기
2/2
post-thumbnail

2021.09 기준
flutter version: 1.22.6
gsheets: ^0.2.7

1. install package

  • pubspec.yaml 추가
  • 현재 0.3.2까지 나와있으나, flutter SDK version이 낮아서 0.2.7로 진행
# google sheet
gsheets: ^0.2.7

2. [GCP] key 생성


3. API Config 생성

3-1. credentials(자격 증명) 얻어오기

  • 안전한 곳에 저장 후 키 파일 열고 복사
  • CandyGSheetsAPIConfig 클래스 생성
  • 복사 된 json key 붙여넣기

class CandyGSheetsAPIConfig {
  static const _credentials = r'''
  {
  "type": "service_account",
  "project_id": "",
	 ...
  "client_x509_cert_url": ""
  }
  ''';
}

다음과 같은 형태로 작성

static const _credentials = r'''
''';

🙋🏻‍♀️ 참고사항

  • r = raw, 원시 문자열 (예시로 \n, \t 안먹히고 문자열 그대로 읽힘)
  • ''' = 멀티 라인 문자열 ('''안으로 감싸져있다면 문자열로 다 인식, 한줄이 아닌 여러 줄로 입력 가능)

3-2. GSheets 객체 완성

  static final candyGSheets = GSheets(_credentials);

전체 코드

import 'package:gsheets/gsheets.dart';

class CandyGSheetsAPIConfig {
  static const _credentials = r'''
  {
  "type": "service_account",
  "project_id": "",
	 ...
  "client_x509_cert_url": ""
  }
  ''';
  static final candyGSheets = GSheets(_credentials);
}

4. Service 생성 후 초기화작업

4-1. sheet id 얻어오기

  • 드라이브 > 우클릭 > google 스프레드시트 추가

  • 주소창 클릭

주소가 다음과 같이 있다면
https://docs.google.com/spreadsheets/d/1kDTrR5pqT8QxeElnSytyji-xxu1UQHpjiBBVLF0GqpE/edit#gid=0

/d/1kDTrR5pqT8QxeElnSytyji-xxu1UQHpjiBBVLF0GqpE/edit
이부분이 스프레드 시트 식별자(id)가 된다.

  • 서비스 클래스 생성
  • api class 생성
class HeavyUserEventService {
  final String _spreadsheetId = '1kDTrR5pqT8QxeElnSytyji-xxu1UQHpjiBBVLF0GqpE';
}

4-2. Spreadsheet,Worksheet 초기화

  • initalWorkSheet() 메소드 생성
  • static하게 선언해두었던 sheet 객체 받아오기
Future<void> initalWorkSheet() async {
  final gseets = CandyGSheetsAPIConfig.candyGSheets;
}

  • _spreadsheetId 사용 해, 시트 객체(=Spreadsheet) 가져옴
class HeavyUserEventService {
  final String _spreadsheetId = '1kDTrR5pqT8QxeElnSytyji-xxu1UQHpjiBBVLF0GqpE';
  Spreadsheet spreadsheet;
  
  Future<void> initalWorkSheet() async {
    final gseets = CandyGSheetsAPIConfig.candyGSheets;
    spreadsheet ??= await gseets.spreadsheet(_spreadsheetId);
  }

  • 시트 안에서 탭 객체(=Worksheet) 가져오기
class HeavyUserEventService {
  final String _workSheetTitle = 'FCM_heavyUser';

	...

  Worksheet workSheet;

  Future<void> initalWorkSheet() async {
		...

    if (workSheet == null) {
      workSheet = await spreadsheet.worksheetByTitle(_workSheetTitle);
      workSheet ??= await spreadsheet.addWorksheet(_workSheetTitle);
    }
  }
}

  • 변수로 두 객체에 잘 쌓임
  Spreadsheet spreadsheet;
  Worksheet workSheet;

  • 전체 코드
class HeavyUserEventService {
  final String _spreadsheetId = '1kDTrR5pqT8QxeElnSytyji-xxu1UQHpjiBBVLF0GqpE';
  final String _workSheetTitle = 'FCM_heavyUser';

  Spreadsheet spreadsheet;
  Worksheet workSheet;

  Future<void> initalWorkSheet() async {
    final gseets = CandyGSheetsAPIConfig.candyGSheets;
    spreadsheet ??= await gseets.spreadsheet(_spreadsheetId);

    if (workSheet == null) {
      workSheet = await spreadsheet.worksheetByTitle(_workSheetTitle);
      workSheet ??= await spreadsheet.addWorksheet(_workSheetTitle);
    }
  }
}

5. insert test

  • workSheet객체를 이용해 insertRow 메소드 생성

  • line 수와 row 입력

    • row 입력시 json, date등 안됨
      // supported value types are: bool, string, and double
  • 전체 코드

class HeavyUserEventService {

  Spreadsheet spreadsheet;
  Worksheet workSheet;

  ...

  void insertRow({
    List<dynamic> row,
  }) async {
    if (workSheet == null) {
      return;
    }

    final result = await workSheet.values.insertRow(
      2, 
      [
        4030.22,
        'Bora Test2',
        20,
        {'dd': 'ss'}.toString()
      ],
    );
    print('$_workSheetTitle insertRow completed $result');
  }
}
  • 메소드 수행 후
  • 시트 확인


cf.

profile
𝙸 𝚊𝚖 𝚊 𝚌𝚞𝚛𝚒𝚘𝚞𝚜 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚎𝚛 𝚠𝚑𝚘 𝚎𝚗𝚓𝚘𝚢𝚜 𝚍𝚎𝚏𝚒𝚗𝚒𝚗𝚐 𝚊 𝚙𝚛𝚘𝚋𝚕𝚎𝚖. 🇰🇷👩🏻‍💻

0개의 댓글