🔗 [Unity] GoogleSheet 데이터 가져와서 사용하기 (이전글 바로가기)
이전에는 단순히 구글 스프레드 시트의 데이터를 UnityWebRequest로 불러오는 방식이었지만, 이번엔 API를 연동하여 해당 시트 데이터의 권한을 인증 받아 유니티 내부에서 수정을 할 수 있도록 개발을 진행하였다.
제목 그대로 원하는 라이브러리에 대한 API를 받은 뒤 프로젝트에서 사용이 가능하다.
GoogleAPI를 관리하는 GoogleCloud에 우선 방문한 뒤 프로젝트를 먼저 생성한다.
생성된 프로젝트에 대하여 이제 구글의 여러 기능에 대한 API를 받을 수 있는 바구니가 생긴 셈 🗂️
그럼 본인의 콘솔에 프로젝트가 뜰 것이고 해당 프로젝트를 기반으로 검색창에 sheet를 치면 구글 시트 api가 나온다. 들어가면 [사용] 버튼 클릭
물론 사용한다고 바로 사용될 수 있는 것은 아니고, 본인의 프로젝트 내에서 사용자 인증 정보를 설정해줘야 진짜 사용이 가능해진다.
이때 어떤 사람들을 해당 api에 access해줄 것인지 설정하는 부분이 있는데 나는 같이 프로젝트 하는 팀원들의 이메일을 넣어눴고 이외에는 필수적으로 설정해줘야할 부분들만 채웠다.
사실 사용자 인증 정보가 없는 유저였다면 자동으로 생성하라고 알림이 상단에 뜬 걸로 기억한다. 그래서 사용자 인증 정보를 완료한 뒤면 본인의 클라이언트 ID
가 발급되고 해당 ID로 접근 가능하게 도와주는 secret json파일
을 다운로드 할 수 있게 된다.
그럼 이제 사용하러 프로젝트로 가보자.
일단 Google API를 unity에서 사용하기 위해서는 url을 통한 패키지 하나를 다운받아야한다. 처음에는 vs .sln에서 바로 사용할 수 있다는 정보를 보고 유니티로의 접근 없이, 바로 관리자를 통해 api 패키지를 설치했는데,
결과적으로 위의 것은 vs 자체에서 지원하는 기능인거지 컴파일은 유니티에서 시작되는 것이기 때문에 유니티 자체에서 패키지로 다운 받지 않으면 api 참조 에러가 뜬다.
그래서 유니티에서 사용하기 위해 패키지 매니저에 들어가 url로 패키지 다운 받기에 아래의 url을 입력한 뒤 add를 눌러줍니다.
https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity
정상적으로 다운받아지면 유니티 엔진 상단 여러 메뉴들 중에 [Nuget]
이라는 탭이 생성되어 있을 것이고(조금 기다리면 생성됩니다) vs에서 한 것처럼 동일하게 google sheet api를 다운받아 줍니다. 그러면 스크립트 내부에서 참조 선언에 에러가 뜨지 않게 됩니다.
우선전으로 참조 선언을 해줍니다.
//GoogleAPIs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System.Threading; // for CancellationToken Struct
사실 구글 도큐먼트가 정말 잘되어있어서 하는데 어렵지는 않을 것이다.
SheetsService.Scope.Spreadsheets
설정해줬다.UserCredential credential;
// Client 토큰 생성
using (var stream = new FileStream
(_data_client, FileMode.Open, FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.FromStream(stream).Secrets,
arr_scope,
"user",
CancellationToken.None,
new FileDataStore(_data_token_folder, true)).Result;
}
token을 보내기 위해 stream을 생성할 때 아까 지정해놓은 시크릿 json파일 경로 변수를 활용해서 해당 파일을 불러오도록 한다.
arr_scope
도 아까 설정한 접근 범위이다.
FileDataStore을 true로 해줘서 원하는 경로에 데이터 스토어가 저장된 모습을 확인할 수 있다.
인증이 정상적으로 진행되어 저장된 credential
을 활용하여 원하는 서비스에 접근하고자 하는 매개체
를 만들어준다.
SheetsService _service = new SheetsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "userName"
});
이제 이 매개체를 통해 원하는 시트의 데이터를 갱신시켜주는 함수를 작성할 수 있게 되었다.
원하는 위치로의 데이터 접근을 위해서는 물론 구글 시트의 셀 위치 체제를 알아야한다
데이터를 가져오는 방법은
_service.Spreadsheets.Values.Get()
를 사용한다.
string select_range = "원하는 시트이름!원하는 범위";
var select = _service.Spreadsheets.Values.Get(_sheet_id, select_range);
var response = select.Execute();
IList<IList<object>> result = response.Values;
시트의 id는 원하는 구글 시트 url 속 네모친 부분이다.
이제 Execute()
로 실행해서 데이터를 받아오면 IList<IList<object>>
라는 2차원 자료형으로 받아줘서 원하는 데로 사용해주면 된다. IList
의 형태라 인덱스로 접근할 수 있다.
디버깅을 찍어보면 이렇게 데이터가 잘 들어와진 모습을 확인할 수 있다.
ClearValuesRequest clear = new ClearValuesRequest();
var deleteAll = _service.Spreadsheets.Values.Clear(
clear, _sheet_id, "원하는 삭제 범위");
deleteAll.Execute();
var valueRange = new ValueRange() {
MajorDimension = "ROWS", // or COLUMNS
Values = list_data // 추가할 데이터
// 받아올 때와 마찬가지로 갱신될 때의 자료형 또한 `IList<IList<object>>`이다.
};
var update = _service.Spreadsheets.Values.Update(
valueRange, _sheet_id, str_sheet_range);
update.ValueInputOption =
SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
// 수식으로 변경되지 않고 문자열 그대로 입력된다는 설정.
// 반대로는 `USER_ENTERED`가 있다.
update.Execute();
이전에 다른 방식으로라도 웹의 데이터를 가져와본 경험이 있어서 그런지 어렵지 않았다. 뿌듯한 결과!
도큐먼트에 따라 원하는 부분들을 체킹하고 코드를 짜다보니 수월하게 진행됐지만, 그 속에서 어떤 형식으로 데이터가 전달되는지 파악하는게 시간을 소모하게 했다.
🔗 [C#]구글 스프레드시트 Api를 활용한 출퇴근 기록기 만들기
🔗 [구글 인증 관련 도큐먼트 for C#]
🔗 [구글 시트 함수 관련 도큐먼트]
🔗 [구글 시트 사용 관련 도큐먼트]