저번편에는 코드를 작성하기전에 준비단계를 거쳤다면 이번편에서는 C#코드상으로 어떻게 인증하고 어떻게 api를 호출하는지 적어보겠다.
구글 Api Nuget 설치
C#의 누겟은 개사기일정도로 너무 편리하다
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;
api를 추가합니다
이제 구글시트api의 코드를 불러올 수 있습니다!!
Api인증
private SheetsService _service = null;
private void DoCredential()
{
// 데이터의 수정,추가를 위해서 SheetsService.Scope.Spreadsheets 해준다.
string[] arr_scope = { 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;
}
// API 서비스 생성
_service = new SheetsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "TimeClock"
});
_is_credential = true;
}
전체코드이다
나도 주워온 코드를 이해하면서 봤고 필요한 부분은 약간의 수정만 거쳤다
// 데이터의 수정,추가를 위해서 SheetsService.Scope.Spreadsheets 해준다.
string[] arr_scope = { SheetsService.Scope.Spreadsheets };
Class SheetsService.Scope | Google.Apis.Sheets.v4
Class SheetsService.Scope Available OAuth 2.0 scopes for use with the Google Sheets API. Inheritance System.Object SheetsService.Scope Inherited Members System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.Ge
googleapis.dev
요기로 들어가면 SheetsService.Scope클래스를 잘 설명해준다
읽기전용 시트, 드라이브까지 설정 등등 몇몇개가 있는데
나는 시트의 수정까지 필요해서 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;
}
//private readonly string _data_client = Environment.CurrentDirectory + "\\Data\\Client\\my_client.json";
//private readonly string _data_token_folder = "Data\\Client";
UserCredential이라는 인증서 변수를 만들고 내용을 채운뒤 토큰을 생성합니다
이전편에 만들었던 클라이언트정보인 json파일이 필요하다
json파일을 가져오고 그 정보를 통해 인증서를 정보를 생성한다.
OAuth로 만들지 않고 서비스계정으로 만들면 더 간편하게 진행되는거 같던데 이거 만들땐 잘 몰랐다... 어차피 개인적인 일로 만드는거라 작동여부에만 살펴봤는데 다음에 해당 프로그램을 수정할 일이 생기면 다시 싹다 봐야할거같긴하다
private SheetsService _service = null;
// API 서비스 생성
_service = new SheetsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "TimeClock"
});
_is_credential = true;
아까 생성한 인증서 정보로 _service를 초기화한다
앞으로 시트를 읽거나 수정할 때 _service를 이용한다.
중간에 ApplicationName은 그냥 뭘 적을지 몰라서 내 프로젝트이름을 넣었다
api로 읽고 쓰기
private void SelectData(string str_column_and_row, out IList<IList<Object>> out_data)
{
if (!_is_credential)
DoCredential();
var request = _service.Spreadsheets.Values.Get(_sheet_id, _sheet_name + "!" + str_column_and_row);
ValueRange response = request.Execute();
out_data = response.Values;
}
private void InsertData(string str_sheet_range, ref List<object> list_data)
{
if (!_is_credential)
DoCredential();
var valueRange = new ValueRange()
{
MajorDimension = "ROWS", // ROWS or COLUMNS
Values = new List<IList<object>> { list_data } // 추가할 데이터
};
var update = _service.Spreadsheets.Values.Update(valueRange, _sheet_id, str_sheet_range);
update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
update.Execute();
}
SelectData()로 읽고 InsertData()로 불러온다
구글시트의 범위표현식?은
['시트이름' ! 셀 : 셀] 처럼 표현하는데 예를 들면
Sheet1!A1:B3 는 시트1의 A1부터 B3까지의 셀인 A1,2,3 B1,2,3의 셀정보를 가져온다는 뜻이고
하나의 셀값만 가져오려면 Sheet!A1이라고만 치면된다
변수중 _sheet_id라고 되어있는 것은
1sZ어쩌고 하는 빨간색으로 칠한 곳이 시트id이다.
private void SelectData(string str_column_and_row, out IList<IList<Object>> out_data)
{
if (!_is_credential)
DoCredential();
var request = _service.Spreadsheets.Values.Get(_sheet_id, _sheet_name + "!" + str_column_and_row);
ValueRange response = request.Execute();
out_data = response.Values;
}
var request에 가져올 데이터의 범위를 설정후 .Execute()로 값을 가져오고 ValueRange라는 형식으로 리턴한다
데이터는 두번이상 불러오기 때문에 변수를 계속 할당하지 않고 미리 IList<IList<Object>> 라는 하나의 변수를 선언해서
데이터를 불러오면 out파라미터로 빼줬다.
private void InsertData(string str_sheet_range, ref List<object> list_data)
{
if (!_is_credential)
DoCredential();
var valueRange = new ValueRange()
{
MajorDimension = "ROWS", // ROWS or COLUMNS
Values = new List<IList<object>> { list_data } // 추가할 데이터
};
var update = _service.Spreadsheets.Values.Update(valueRange, _sheet_id, str_sheet_range);
update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
update.Execute();
}
데이터를 입력할 범위를 설정한다.
MajorDimension은 마우스를 올리면 설명이 길게 나오는데 대충 뭐냐면
입력할 데이터배열이 1,2,3,4라는 4개의 값이 있다면
1 2 1 3
3 4 로 넣을 것인지 2 4 로 넣을 것인지
기준점을 ROWS or COLUMNS으로 설정하는 곳이다 ROWS로 설정하면 행이 우선순위를 가져서 왼쪽처럼 값이 들어간다
밑에는 위에 만들었던 데이터입력정보를 토대로 실행하는 곳인데
여기는 그냥 아~ ValueInputOption을 통해서 입력값에도 옵션을 줄 수 있구나~하고 넘어갔다
이제 우리는 api를 인증받고 시트를 읽고 쓸수 있게 되었다
다음 편은 api를 통해 출퇴근 프로그램 코드를 적어보겠따
'사이드프로젝트' 카테고리의 다른 글
[C#] 셀레니움,Selenium 사용법 (3) - XPath 그리고 클릭 (0) | 2022.12.17 |
---|---|
[C#] 셀레니움,Selenium 사용법 (2) - 옵션설정 (0) | 2022.12.17 |
[C#] 셀레니움,Selenium 사용법 (1) - 준비단계 (0) | 2022.12.17 |
[C#]구글 스프레드시트 Api를 활용한 출퇴근 기록기 만들기 (3) (0) | 2022.11.05 |
[C#]구글 스프레드시트 Api를 활용한 출퇴근 기록기 만들기 (1) (0) | 2022.11.05 |