최근에는 코드 검토 작업량에 대한 차트를 공유하기 위해 GitHub API에서 데이터를 가져와 Google 시트에 게시해야 했습니다. 이번 포스팅은 제가 어떻게 인증을 받았는지에 대한 글입니다.
제 사용 사례가 BASH에는 너무 복잡하고 Go에는 너무 일시적인 것처럼 보였기 때문에 Node.js 스크립트를 작성했습니다. 처음에 스크립트는 CSV로 붙여넣기 기능을 사용하여 Google 스프레드시트에 수동으로 복사할 수 있는 임시 CSV 데이터를 생성했습니다. 몇 차례 수동으로 복사한 후 시간을 현명하게 사용하고 싶었습니다. 몇 시간 내에 Sheets 통합이 작동할 수 있을 것으로 예상했는데 그렇게 된다면 그렇게 될 것입니다
아마도 몇 달 안에 상환될 것입니다.
여담: 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 범위를 내 개발 환경 자격 증명에 추가하는 위의 트릭을 이해하면 샘플이 작동했습니다.
클라이언트를 더 쉽게 재사용하고, 요청을 다르게 매개변수화하고, Sheets에서 데이터를 처리하는 방법을 강조하기 위해 몇 가지 변경 사항을 적용했습니다.
위의 클라이언트 초기화 코드를 활용하여 시트에 데이터를 추가하는 내 코드:
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 );
문서에는 시트당 초당 2개 이상의 API 요청을 보내지 말라는 제안과 같이 Sheets API 작업에 대한 몇 가지 좋은 팁이 문서에 있습니다. 어렵게 알아낸 것은 첫 번째 요청의 데이터를 두 번째 요청의 데이터로 덮어쓰는 것입니다.
이것을 제작하게 되면 다음을 사용하여 전환할 수도 있습니다
Cloud Scheduler 및 Cloud Run 작업 이에 대해 읽고 싶으시면 알려주세요.
Unsplash의 Glib Albovsky 표지 사진
위 내용은 gcloud CLI 인증을 통해 로컬 스크립트에서 Google Sheets에 쓰기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!