👨👩👧👦
GitHubにgoogledriveのコンテンツをGASでpushする
概要
これは何
この記事では、google drive上のテキストファイルをGithubのリポジトリにcommit,pushするGASのスクリプトを紹介します。
使ったもの
- GitHub RESTAPI
- GAS
実装
リポジトリ
使い方
commitDriveGitHub
に次のパラメータを渡してあげると、対象filderId内のファイルをbranchのmasterにpushします。リポジトリではプロパティストアに格納しています。
- GitHubのAPItoken
- GitHubのuser名
- 厳密には対象ブランチのオーナー、私の場合はmirito333
- 対象リポジトリ名
- コミット時のauthor nameとemail
- 多分なんでもいい。一応指定できるようにした
- GoogleDriveの対象folderId
- 対象フォルダを開いた時のurlの最後のpath
- 対象フォルダを開いた時のurlの最後のpath
やってること
- GitHubから親コミットの取得
function getGithubParent(props){
var response = UrlFetchApp.fetch(props.base_url+"refs/heads/master", {
headers: {
Authorization: 'token ' + props.token
}
});
props.base_ref = JSON.parse(response).object.sha
response = UrlFetchApp.fetch(props.base_url+"commits/"+props.base_ref, {
headers: {
Authorization: 'token ' + props.token
}
});
props.base_tree = JSON.parse(response).tree.sha
return props
}
- folderId内のファイル名とその内容を取得
function getDriveFiles(folderId,extensions){
const folder = DriveApp.getFolderById(folderId);
const files = folder.getFiles();
const fileContents = []
while(files.hasNext()){
let file = files.next();
let fileName =file.getName();
let fileContent = ""
if (extensions.includes(getFileExtension(fileName))){
fileContent = file.getBlob().getDataAsString("utf-8");
fileContents.push({name: fileName,content: fileContent})
}
}
return fileContents
}
- 各ファイルについてblobの作成
function createGithubBlobs(props,files){
let blobs = []
files.forEach(function(file){
let content = file.content
let response = UrlFetchApp.fetch(props.base_url+"blobs", {
'method' : 'POST',
headers: {
Authorization: 'token ' + props.token,
},
'payload' : JSON.stringify({
"content": content,
"encoding": "utf-8"
})
});
blobs.push({fileName: file.name, sha: JSON.parse(response).sha})
})
return blobs
}
- blobをtreeにして、commitする
function createGithubTree(props,blobs){
let post_data = {
"base_tree": props.base_tree,
"tree": []
}
blobs.forEach(function(blob){
post_data.tree.push(
{
"path": blob.fileName,
"mode": "100644",
"type": "blob",
"sha" : blob.sha
}
)
})
let response = UrlFetchApp.fetch(props.base_url+"trees", {
'method' : 'POST',
headers: {
Authorization: 'token ' + props.token,
},
'payload' : JSON.stringify(post_data)
});
return JSON.parse(response).sha
}
参考
Discussion