최근에는 코드 검토 작업량에 대한 차트를 공유할 수 있도록 GitHub API에서 데이터를 가져와 Google 시트에 게시해야 했습니다. 이 게시물은 인증이 작동하는 방법에 대한 것입니다.
내 사용 사례가 BASH에는 너무 복잡하고 Go에는 너무 임시적이어서 Node.js 스크립트를 작성했습니다. 처음에 스크립트는 CSV로 붙여넣기 기능을 사용하여 Google 스프레드시트에 수동으로 복사할 수 있는 임시 CSV 데이터를 생성했습니다. 몇 차례 수동으로 복사한 후 시간을 현명하게 사용하고 싶었습니다. 몇 시간 내에 Sheets 통합이 작동할 수 있을 것으로 예상했는데 그렇게 된다면 그렇게 될 것입니다
아마도 몇 달 안에 성과를 낼 것입니다.
참고: 스프레드시트는 내 데이터베이스가 아닙니다. 내 데이터 보고 UI입니다. 시트를 데이터베이스로 사용하지 마세요.
인증이 어렵기 때문에 이 작업을 수행하는 데 거의 4시간이 걸렸습니다. 이 게시물은 작동하는 솔루션에 대한 보다 직접적인 경로를 보여줍니다.
oAuth 애플리케이션을 만드는 복잡성으로 인해 주의가 산만해지기 쉽습니다. 특히 클라우드 서비스의 서비스 계정을 사용하는 것을 좋아하지만
로컬로 실행할 때는 덜 편리합니다.
제가 배운 비결은 gcloud CLI의 애플리케이션 기본 사용자 인증 정보 설정이 더 많은 권한(OAuth 범위)을 포함하도록 Google에서 계정을 인증하는 방법을 확장하여 일종의 Google Workspace 코드에 대한 OAuth 프록시로 작동할 수 있다는 것입니다.
Google Sheets에 API를 요청하려면 클라우드 프로젝트에서 Sheets API를 활성화하세요.
$> gcloud services enable sheets.googleapis.com Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.
애플리케이션 기본 자격 증명을 설정하고 자격 증명을 시트에서 사용할 수 있도록 기본이 아닌 OAuth 범위도 요청합니다.
$> gcloud auth application-default login --scopes \ 'https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets'
이렇게 하면 브라우저에서 웹페이지를 방문하는 OAuth 흐름이 실행됩니다. 터미널 구성에 따라 URL이 표시되거나 페이지가 열릴 수도 있습니다.
gcloud에 이 범위가 부여되면 로컬 사용자 인증 정보에 액세스할 수 있는 코드에 모든 Google Sheets 데이터에 대한 읽기/쓰기 액세스 권한이 부여됩니다. 사용자 정의된 범위 없이 이 명령을 다시 실행하여 필요에 따라 해당 액세스를 켜거나 끌 수 있습니다.
import {google} from 'googleapis'; function sheetsClient() { const authConfig = new google.auth.GoogleAuth({ scopes: [ // Only 'spreadsheets' scope is needed in the code. // gcloud CLI also needs 'cloud-platform' and 'drive'. 'https://www.googleapis.com/auth/spreadsheets' ], }); const auth = await authConfig.getClient(); return google.sheets({version: 'v4', auth}); }
시트에 데이터를 추가하는 방법에 대한 문서의 샘플
(Node.js 탭 클릭) 잘 작동했습니다. 그러나 거기에서 인증을 얻는 방법을 이해할 수 없었습니다. 누락된 OAuth 범위를 내 개발 환경 자격 증명에 추가하는 위의 트릭을 이해하면 샘플이 작동했습니다.
클라이언트를 더 쉽게 재사용하고, 요청을 다르게 매개변수화하고, 스프레드시트에서 데이터를 처리하는 방법을 강조하기 위해 몇 가지 사항을 변경했습니다.
위의 클라이언트 초기화 코드를 활용하여 시트에 데이터를 추가하는 내 코드:
let client; async function appendDataToSheet(spreadsheetId, tab, values) { if (!client) { client = sheetsClient(); } try { const result = await client.spreadsheets.values.append({ spreadsheetId, range: `${tab}!A2:AG`, // Use my data as provided. valueInputOption: 'RAW', // Inserts rows as part of appending to reduce overwrites. insertDataOption: 'INSERT_ROWS', requestBody: { values }, }); console.log(`${result.data.updates.updatedCells} cells appended.`); } catch(e) { // Show the error, do not stop. Cross-reference the error with terminal output // and decide case-by-case to re-run the script or manually copy data. console.error(e); } }
내 스크립트가 월별 측정항목을 수집하고 추가를 사용하면 이전 행을 제거하지 않고도 새 행을 추가할 수 있으므로 '추가'를 사용하고 있습니다.
다음은 AppendDataToSheet() 함수를 호출하는 방법에 대한 예입니다.
const values = [ // Each nested array is a spreadsheet row. [1, 2, 3, 4, 'luggage'], [4, 5, 6, 'N/A', 'sticks'], ]; appendDataToSheet( 'HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample', 'Exported Data Tab', values );
문서에는 시트당 초당 두 개 이상의 API 요청을 보내지 말라는 제안과 같이 Sheets API 작업에 대한 몇 가지 좋은 팁이 문서에 있습니다. 어렵게 알아낸 것은 첫 번째 요청의 데이터를 두 번째 요청의 데이터로 덮어쓰는 것이었습니다.
이것을 제작하기 위해 앞으로 나아가면
사용으로 전환할 수도 있습니다.
Cloud Scheduler 및 Cloud Run 작업 이에 대해 읽고 싶으시면 알려주세요.
Unsplash의 Glib Albovsky가 표지 사진
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3