Languages/JavaScript

Google Spreadsheet to JSON

iam102 2024. 7. 7. 15:12

다국어 처리 작업을 진행하면서 Google Spreadsheet로 정리된 다국어 내용을 프로젝트 내부에서 JSON 형태로 쓰기 위해 변환 작업이 필요했습니다. 해당 작업을 진행하면서 내용을 정리하게 되었습니다.

 

작업 내용

작업을 진행하기 앞서 Google Spreadsheet를 작성합니다. 작성된 다국어를 key-value 형태의 JSON으로 만들기 위해 key row와 사용할 다국어 언어 row를 만들어 작성합니다.

 

1. 필요 라이브러리 설치

작업에 사용할 dotenv, google-spreadsheet, google-auth-library를 설치합니다. dotenv는. env 파일에서 환경 변수를 들고 오기 위해 사용되고 google-spreadsheet, google-auth-library는 작성된 Google Spreadsheet로부터 데이터를 가져오기 위해 사용합니다.

npm install -D dotenv google-spreadsheet google-auth-library

# or

yarn add -D dotenv google-spreadsheet google-auth-library

 

2. 스크립트 코드 작성

Google Spreadsheet에서 데이터를 가져오기 위해 환경 변수를 설정합니다. Google Service account 관련 내용은 해당 링크에서 확인하여 설정합니다.

# .env.sheet
GOOGLE_SERVICE_ACCOUNT_EMAIL=<Google Service account email>
GOOGLE_PRIVATE_KEY=<Google Service account key>
GOOGLE_SPREADSHEET_ID=<the sheet ID from the url>

 

스크립트 코드는 Google Spreadsheet 라이브러리를 통해 Google Spreadsheet에서 데이터를 가져와 다국어 key-value 형태의 Object를 생성해 JSON으로 내보내는 flow로 작성합니다. 아래의 코드를 참고하면 되겠습니다.

// lang.js
const fs = require("fs");
const dotenv = require("dotenv");
const { GoogleSpreadsheet } = require("google-spreadsheet");
const { JWT } = require("google-auth-library");

dotenv.config({ path: `${__dirname}/../.env.sheet` });

const serviceAccountAuth = new JWT({
  email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  key: process.env.GOOGLE_PRIVATE_KEY,
  scopes: ["https://www.googleapis.com/auth/spreadsheets"],
});

const doc = new GoogleSpreadsheet(
  process.env.GOOGLE_SPREADSHEET_ID,
  serviceAccountAuth
);

const loadSheet = async () => {
  try {
    await doc.loadInfo();

    const sheet = doc.sheetsById[0];
    const rows = await sheet.getRows();

    const korean = {};
    const english = {};

    rows.map((row) => {
      const key = row.get("key");
      korean[key] = row.get("ko");
      english[key] = row.get("en");
    });

    await fs.promises
      .mkdir(`${__dirname}/../translations`, { recursive: true })
      .catch(console.error);

    fs.writeFileSync(
      `${__dirname}/../translations/lang_ko.json`,
      JSON.stringify(korean)
    );
    fs.writeFileSync(
      `${__dirname}/../translations/lang_en.json`,
      JSON.stringify(english)
    );
  } catch (e) {
    console.error("error: ", e.message);
  }
};

loadSheet();

 

3. 스크립트 코드 실행

코드 작성후 package.json에 command를 추가합니다.

...
  "scripts": {
	...
    "lang": "node lang.js"
  },
 ...

 

해당 스크립트 실행하여 파일이 정상적으로 생성되는지 확인합니다.

 

마무리

다국어 작업을 위해 사용했지만 Google Spreadsheet로 작성된 내용을 가져와 사용하는 방식은 다양하게 활용할 수 있을 것 같습니다. 위의 내용을 참고하여 다양하게 활용하여 사용하시면 좋겠습니다.

 


참고 자료

https://www.npmjs.com/package/google-spreadsheet

https://jgjgill-blog.netlify.app/post/google-spreadsheet-with-javascript/