Skip to content

Instantly share code, notes, and snippets.

@kyungpyoda
Last active April 7, 2022 02:14
Show Gist options
  • Save kyungpyoda/1e53e1d44229a8c9ae3a5be9e4558096 to your computer and use it in GitHub Desktop.
Save kyungpyoda/1e53e1d44229a8c9ae3a5be9e4558096 to your computer and use it in GitHub Desktop.
Manage and generate string resources through Google Spread Sheet
var appName = "AppName";
// 메뉴바 추가
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [
{
name : "Create iOS Resources",
functionName : "exportiOSResources"
},
{
name : "Create Android Resources",
functionName : "exportAndroidResources"
}
];
sheet.addMenu(appName, entries);
};
// iOS 리소스 export
function exportiOSResources() {
// Folders
var appFolder = createOrGetFolder(appName);
var iOSFolder = createOrGetFolder("iOS", appFolder);
// Data
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var i = 2;
while (data[1][i] != null && data[1][i].length > 0) {
var results = data[1][i].match(/\((\w\w)\)/g);
if (results.length > 0) {
var language = results[0].replace("(", "").replace(")", "");
createIOSResources(language, data, iOSFolder, i);
}
i++;
}
}
// Android 리소스 export
function exportAndroidResources() {
// Folders
var appFolder = createOrGetFolder(appName);
var androidFolder = createOrGetFolder("Android", appFolder);
// Data
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var i = 2;
while (data[1][i] != null && data[1][i].length > 0) {
var results = data[1][i].match(/\((\w\w)\)/g);
if (results.length > 0) {
var language = results[0].replace("(", "").replace(")", "");
createAndroidResources(language, data, androidFolder, i);
}
i++;
}
}
// Create an XML file for Android
// language: Current language
// data: Spreadsheet data array
// folder: Folder where create the file
// column: Index of the column
function createAndroidResources(language, data, folder, column) {
var folderName = "values-" + language;
var languageFolder = createOrGetFolder(folderName, folder);
var content = "<resources>";
for (var i = 3; i < data.length; i++) {
if (data[i][1].length == 0) {
continue;
}
if (data[i][0].length > 0) {
content += "\n\n\t<!-- " + data[i][0] + " -->";
}
var formatted = "";
if (data[i][column].indexOf("%s") > -1 || data[i][column].indexOf("%d") > -1 || data[i][column].indexOf("%@") > -1) {
formatted = ' formatted="false"';
}
var escapedContent = data[i][column]
.replace("%@", "%s")
.replace("&", "&amp;")
.replace(new RegExp("\'", 'g'), "\\'")
.replace(new RegExp("\\.\\.\\.", 'g'), "&#8230;");
content += '\n\t<string name="' + data[i][1] + '"' + formatted + '>' + escapedContent + '</string>';
}
content += "\n\n</resources>";
var file = createOrGetFile("strings.xml", languageFolder);
file.setContent(content);
}
// Create a localizable file for iOS
// language: Current language
// data: Spreadsheet data array
// folder: Folder where create the file
// column: Index of the column
function createIOSResources(language, data, folder, column) {
var content = "// App";
for (var i = 3; i < data.length; i++) {
if (data[i][1].length == 0) {
continue;
}
if (data[i][0].length > 0) {
content += "\n\n// " + data[i][0] + "";
}
var value = data[i][column];
value = value.replace(/%s/g, "%@");
value = value.replace(/"/g, '\\"');
value = value.replace(/(?:\r\n|\r|\n)/g, '\\n');
content += '\n"' + data[i][1] + '" = "' + value + '";';
}
var fileName = "Localizable_" + language.toUpperCase() + ".strings";
var file = createOrGetFile(fileName, folder);
file.setContent(content);
}
////////////
// HELPER //
////////////
// Check folder
function createOrGetFolder(name, folder) {
var folders;
if (folder == undefined) {
folders = DriveApp.getFoldersByName(name)
} else {
folders = folder.getFoldersByName(name)
}
var mainFolder;
if (folders.hasNext()) {
mainFolder = folders.next();
} else {
if (folder == undefined) {
mainFolder = DriveApp.createFolder(name);
} else {
mainFolder = folder.createFolder(name);
}
}
return mainFolder;
}
// Check file
function createOrGetFile(name, folder) {
var files;
if (folder == undefined) {
files = DriveApp.getFilesByName(name)
} else {
files = folder.getFilesByName(name)
}
var file;
if (files.hasNext()) {
file = files.next();
} else {
if (folder == undefined) {
file = DriveApp.createFile(name, "");
} else {
file = folder.createFile(name, "");
}
}
return file;
}
@kyungpyoda
Copy link
Author

Reference
https://github.com/aurelhubert/android-ios-drive-export

  1. Create a new spread sheet.
  2. Add this script to your spread sheet.
  3. Go to Menu-Tools-Script Editor, paste this script, then save and refresh the sheet page.4.
  4. Follow this form. Do not modify the first 3 lines, except for adding new language columns.
    image
  5. Go to Menu-"AppName"-"Create iOS(or Android) Resources" to run script.
  6. Check your Google Drive.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment