Google Apps Script(以降GAS)は、Googleのクラウドベースのスクリプティング言語です。Google Workspaceアプリケーションを自動化し、拡張するために使用されます。
この機能は無料で使えてしまうのがすごいところ。すでに使用しているツールのAPIがあれば、そのツールとの連携も容易にできてしまいますし、スプレッドシートにまとめた情報からX(旧twitter)に自動投稿なんてこともできてしまいます。
本ブログでは、Google Apps Scriptを初めて触ったインターン生の私が、Chat GPTを活用しながらこれまでに作成した機能を紹介します。また、簡単な実装方法についても紹介します。
GASとは
Google Apps Script(GAS)は、Google Workspaceのサービスや他のGoogleのウェブサービスを拡張し、自動化するためのクラウドベースのスクリプト言語です。JavaScriptに基づいており、Googleドキュメント、スプレッドシート、フォーム、カレンダーなどのアプリケーションにカスタム機能を追加することができます。Google Apps Scriptは非常に柔軟性が高く、簡単なタスクから複雑な業務プロセスまで幅広い用途で利用されています。
作成方法
まず、作成したいツールや機能の概要を決定します。内容がある程度決まったら、その内容をchat gptに伝え、その機能を実現するGASのコードを作成して欲しいと依頼します。
ある程度の内容は一発で出力されますが、細かい調整や、こちらの意図が上手く伝わらないこともあるので、状況に応じて修正をChat GPTにお願いしたり、こちらで手直しを行います。
このとき、どのような返し値や結果が欲しいのかを具体例としてChat GPTに提示してあげることでより意図が伝わりやすくなります。
作成した機能
- 掃除当番の割り振り及び通知機能
- インターン生のシフト通知機能
- X自動投稿機能
以下でそれぞれ説明していきます。
掃除当番の割り振り及び通知機能
背景
現在オフィスの掃除は社員が担当制で行なっており、以前まではその担当をシフトを元に手動で設定していました。軽いタスクなので、そこまで負担にはなりませんが、忘れる可能性があったり、軽いタスクといえど、多少の時間は取られてしまうという問題がありました。そこで、社員も増え、シフトの考慮も必要無くなったこともあり、自動で割り振りをできるようにしたい、ということから作成を行うことになりました。
使用ツール
使用したのは、
- GAS
- Google spread sheet
- Slack API
の3つです。
それぞれの関係の概要を以下の図に示します。
仕組み
まず、spread sheetに掃除当番をまとめるシートと、メンバー名とslack idを並べたメンバーリストシートを作成しておきます。
そして、メンバーリストの上から順に当番をGASで割り振り、Spread sheetにまとめます(担当週と担当者)。
GASには、トリガー機能があるので、毎週月曜日にSpread sheetを確認し、該当の担当者の名前を読み取り、その名前とslack idをメンバーリストシートで照合し、slack AP(カスタムインテグレーションを使用)を使ってslack 通知を行います。
コードを全て載せると長くなってしまうので、一部の関数を例として掲載します。
function notification_everyweek() {
const membersSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メンバーリスト");
const dutySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("担当表");
const members = getSlackIds(membersSheet);
const today = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd");
const dutyRange = dutySheet.getDataRange();
const dutyValues = dutyRange.getValues();
for (let i = 1; i < dutyValues.length; i++) {
const row = dutyValues[i];
const date = Utilities.formatDate(row[0], "JST", "yyyy-MM-dd");
const person = row[1];
if (date === today && members[person]) {
const message = `<@${members[person]}> さん、${date}の週の掃除担当です。よろしくお願いいたします。`;
postToSlack(message);
}
}
}
function getSlackIds(sheet) {
const range = sheet.getDataRange();
const values = range.getValues();
let members = {};
values.forEach(row => {
const name = row[0];
const slackId = row[1];
members[name] = slackId;
});
return members;
}
function postToSlack(message) {
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/(省略)';
const payload = JSON.stringify({text: message});
const options = {
method: 'post',
contentType: 'application/json',
payload: payload
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}
動作
インターン生のシフト通知機能
背景
弊社では、インターン生はシフト制を採用しており、アルバイトという形で業務に取り組んでいます。しかし、シフトは不定期なためいつシフトが入っているのかを毎回把握するのは大変です。そこで、インターン生のシフトがある場合には当日朝に本人への通知も合わせてslack 通知をしようということになりました。
使用ツール
使用したのは、
- GAS
- Google spread sheet
- Slack API
- oplus API
の4つです。
それぞれの関係の概要を以下の図に示します。
仕組み
弊社ではoplusというシフト管理ツールをインターン生に対して使用しており、このツールにAPIがあるため、毎月末に次の月のシフトデータ(名前、日にち、勤務時間)を取得し、spread sheetにまとめます。そして、毎朝GASでspread sheetを確認し、その日のシフトデータがあればslack APIを使ってSlack 通知します。(slack通知でメンションができるように事前にメンバーリストシートを作成し、slack idを設定しています。)
API keyなどはGASのスクリプトプロパティに設定しておき、コードでは
scriptProps.getProperty(‘変数名’)
のようにして取得するとセキュリティ面で良いです。
//シフトデータを取得
function getShifts() {
var today = new Date();
var firstDayOfThisMonth = new Date(today.getFullYear(), today.getMonth(), 1);
var lastDayOfThisMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
var from = formatDate(firstDayOfThisMonth);
var to = formatDate(lastDayOfThisMonth);
var apiUrl = 'https://opluswork.com/api/e/v1/(省略)/shifts?from=' + from + '&to=' + to;
var apiKey = ''; // 実際のAPIキーに置き換えてください
var options = {
'method' : 'get',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(apiUrl, options);
var data = JSON.parse(response.getContentText());
Logger.log(data);
var employeeMap = getEmployeeData();
writeToSpreadsheet(data.shifts, employeeMap);
}
動作
X自動投稿機能
背景
弊社が提供する「AI英会話さん」のPRの一環として、Xへの英語tipsの投稿を毎日したく、手動で毎日投稿は大変なので、事前に投稿内容を作成しておき、その内容を自動で投稿するようにしたく、この機能を作成しました。
使用ツール
使用したのは、
- GAS
- Google spread sheet
- Open API(chat gpt)
- twitter API
の4つです。
それぞれの関係の概要を以下の図に示します。
仕組み
まず、Open API(chat GPT)を用いて投稿内容を作成し、spread sheetにまとめます。(投稿内容、投稿日、投稿承認チェックボックスなど)そして、毎日GASのトリガーでSpread sheetを確認し、投稿承認がチェックになっているのを確認後Twitter APIと連携して投稿を行います。
(このツールは投稿文作成のコード作成より、Xの認証周りの実装が大変でした。)
const endpoint2 = "https://api.twitter.com/2/tweets";
//認証を確認し、ツイート
function check_and_maketweet() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("投稿内容");
const rows = sheet.getDataRange().getValues();
// ヘッダ行をスキップし、各行をチェック
for (let i = 1; i < rows.length; i++) {
let row = rows[i];
let [no, content, postDate, approved, status] = row;
// 承認されており、まだ投稿されていないものを検出
if (approved === true && status !== 'posted') {
let today = new Date();
let postDateObj = new Date(postDate);
if (postDateObj <= today) {
postTwitter(content); // Twitterに投稿
sheet.getRange(i + 1, 5).setValue('posted'); // ステータスを更新
return;//一度に2ツイートしないように
}
}
}
}
//ツイートの処理
function postTwitter(twitterText) {
let service = getService(); // OAuthサービスのインスタンス取得
if (service.hasAccess()) {
let message = {
text: twitterText
};
let response = UrlFetchApp.fetch(endpoint2, {
method: "post",
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
},
muteHttpExceptions: true,
payload: JSON.stringify(message),
contentType: "application/json"
});
let result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
} else {
Logger.log("Not Authorized");
return null;
}
}
動作
感想
Chat GPTによって素人でもできることの幅が広がった!というのが一番の感想です。私自身は多少プログラミングの経験がありますが、GASの利用は初めてでかつ、GASと似ているJavaScriptの経験もほぼ0でした。ゼロからコードは書けないが、ある程度はコードが読める程度です。おそらくChat GPTがなければ実装にかなり時間がかかっていたのではと感じます。しかし、今回の実装は全てがスラスラ進んだわけではないですが、それでも自分で試行錯誤しながらも完成させ、実際に社内で運用できています。作ったものが実際に運用されているのは嬉しいですね。
今回の実装で、特に大変だったと感じたのはXの自動投稿機能における認証周りでした。これに関しては、chat GPTだと情報が少し昔のものだからか、どうもchat GPTに言われた通りではうまくいかず、結局ネットの力を借りての実装になりました。このような、頻繁に使用が更新されるものに関しては、Chat GPTの力不足を感じるところがありました。
slack通知に使用していたcustom integrationですが、現在は同様の機能をslackアプリでできるようになったそうです。この機能の方がコードとかが完結になりそうなので、こちら方がいいかも。
終わりに
いかがだったでしょうか。ぜひ皆さんもこんなツールがあったらなというものがあったら挑戦してみてください。私も、業務外でサークルにあったらいいなというツール、機能?の実装を行なってみました。
一度作成してみると、意外と自分にもできるんだ!という感覚が掴めると思います。
chat GPTが出てきて、知識があまりなくても色々できるようになっています。
自分には難しい、と初めから諦めてしまわずちょっと触ってみてはいかがでしょうか?