[GAS] Slack의 파일을 전부 GoogleDrive에 무료 업로드!
이번이 qiita 첫 투고이므로, 이르지 않는 점은 많게 봐 주세요.
소개
Slack을 사용하여 일하는 분, 최근 많은 것이 아닐까요.
반응을 날리거나 채널별로 알림 설정을 할 수 있다고 뭔가 편리한 Slack입니다만, 어느새 과거의 파일이 사라지고 있는 것이 자주...
Free 플랜의 스토리지가 5GB 밖에 없는 것은, 과거 사례의 참조나 인계를 곤란하게 해, Slack의 편리성을 낮추고 있습니다.
어떻게든 할 수 없는 것인가...그러나 돈은 걸고 싶지 않다.
그래서 Slack의 파일을 통째로 googleDrive에 업로드하고 싶습니다.
게다가 GAS를 사용하면 놀라울 정도로 간단하게 게다가 서버리스로 쓸 수 있습니다!
특히 G Suite를 사용하는 분은 googleDrive 용량이 충분하다고 생각되기 때문에 매우 좋습니다!
Slack의 모든 파일을 googleDrive에 업로드하는 코드
사양
이 시스템은 slack의 작업을 트리거하는 대신 cron에 의해 매일 실행됩니다. 두드리는 것도 slackAPI뿐입니다.
다음과 같이 작동합니다.
사양
이 시스템은 slack의 작업을 트리거하는 대신 cron에 의해 매일 실행됩니다. 두드리는 것도 slackAPI뿐입니다.
다음과 같이 작동합니다.
준비
Slack Access Token 얻기
슬랙 앱을 만드세요.
먼저 여기으로 이동하여 새 앱을 만듭니다. 그런 다음 OAuth & Permissions에서 다음 범위를 추가합니다.
범위를 추가한 후 잊지 말고 앱을 작업공간에 설치해 보세요.
여기서 나오는 OAuth Access Token은 향후 사용할 예정입니다.
(그 이외는 사용하지 않으므로, 이미 Slack 앱을 제작한 적이 있는 경우는 기존의 앱에 상기 permission을 더해 AccessToken만을 사용해도 상관없습니다.)
googleDrive의 FolderID 가져 오기
그런 다음 GoogleDrive에서 사용할 폴더로 이동합니다.
URL의 folders 다음 부분은 FolderID입니다.
프로그램
방금 취득한 AccessToken은 적절하게 「파일 > 프로젝트의 프로퍼티 > 스크립트의 프로퍼티」에 「TOKEN」의 이름으로 등록해 주세요. 업로드하려는 Google 드라이브의 FolderID도 마찬가지로 'FOLDER_ID'라는 이름으로 등록해야 합니다.
fileApp.gs
function main(){
var scriptProperties = PropertiesService.getScriptProperties();
var slackAccessToken = scriptProperties.getProperty("TOKEN");
var channelsRawData=UrlFetchApp.fetch('https://slack.com/api/channels.list?exclude_archived=true&token='+slackAccessToken)
var channelsJson = JSON.parse(channelsRawData.getContentText());
var channels = channelsJson.channels;
for(var i = 0; i < channels.length; ++i){
moveFiles(channels[i].id,channels[i].name);
}
}
function moveFiles(cid,cname){
var scriptProperties = PropertiesService.getScriptProperties();
var slackAccessToken = scriptProperties.getProperty("TOKEN");
var folderId = scriptProperties.getProperty("FOLDER_ID");
var dateUnix= parseInt(new Date() /1000) ;
var dateS =dateUnix - 86400-3600;
var dateE = dateUnix - 3600;
var filesRawData=UrlFetchApp.fetch('https://slack.com/api/files.list?token='+slackAccessToken+'&channel='+cid+'&count=200&ts_from='+dateS+'&ts_to='+dateE);
//初めて実行するときに上記でなく
//var filesRawData=UrlFetchApp.fetch('https://slack.com/api/files.list?token='+slackAccessToken+'&channel='+cid+'&count=200');
//とすれば、全てのファイルを得られる。
var filesJson = JSON.parse(filesRawData.getContentText());
var files = filesJson.files;
var rootFolder = DriveApp.getFolderById(folderId);
var targetFolder = rootFolder.getFoldersByName(cname);
if(targetFolder.hasNext() == false){
var targetFolderId = rootFolder.createFolder(cname);
} else {
var targetFolderId = DriveApp.getFolderById(targetFolder.next().getId());
}
for(var i = 0; i < files.length; ++i){
if (files[i].external_type != 'gdrive' && files[i].size<50000000){
var timestamp = files[i].timestamp;
var d = new Date(timestamp*1000);
var date =Utilities.formatDate( d, 'Asia/Tokyo', 'yyyy-MM-dd-hhmm');
var headers = {
"Authorization" : "Bearer " + slackAccessToken
};
var params2 = {
"method":"GET",
"headers":headers
};
var dlData = UrlFetchApp.fetch(files[i].url_private, params2).getBlob();
//yyyy-MM-dd-hhmmファイル名で保存している。
dlData.setName(date+files[i].name);
var driveFile = targetFolderId.createFile(dlData);
}
}
Utilities.sleep(100);
}
정기 실행
여기에서 트리거를 추가하고 이동하려는 시간으로 이동하면 정기 실행됩니다.
cron도 간단하다!
요약
GAS로 50행 조금의 코드에서도 Slack이 보다 사용하기 쉬워지므로, 꼭 도입해 보세요!
관련 기사
Slack 스토리지를 사용하지 않고 파일 업로드 ~ 업로드된 파일을 즉시 Google 드라이브로 전송~
코드를 쓸 때와 qiita를 쓸 때 참고로 했습니다. 이쪽은 즉시 응답 프로그램이군요.
Reference
이 문제에 관하여([GAS] Slack의 파일을 전부 GoogleDrive에 무료 업로드!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/pn8128/items/0b1d576acb281073aca4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Slack 스토리지를 사용하지 않고 파일 업로드 ~ 업로드된 파일을 즉시 Google 드라이브로 전송~
코드를 쓸 때와 qiita를 쓸 때 참고로 했습니다. 이쪽은 즉시 응답 프로그램이군요.
Reference
이 문제에 관하여([GAS] Slack의 파일을 전부 GoogleDrive에 무료 업로드!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/pn8128/items/0b1d576acb281073aca4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)