見出し画像

ChatGPTを使って作ったもの① #GAS

Excelやスプシのスキルがごく一般レベルでもChatGPTやAIを使えばいろんなものが作れちゃいます!

今思いつくChatGPTを使って作ったものはこんな感じです。

  • スプシが変更されたら通知がChatworkへ届くGAS

  • 関数をいろいろ使った自分専用の在庫管理データ

  • 一覧リストと請求書テンプレが連動しているスプシ

  • Gmailに届いたメール内容がChatWorkへも届くGAS

  • スプシが変更されたら通知がChatworkへ届くGAS

  • 名前等を自動に差し込んで一斉メールを送れるPython

  • 複数セルの文字をテンプレに差し込んで表示させるExcel

  • 毎日指定時間に自動で必要なCSVデータをダウンロードするPowerAutomate

などなど・・・


今日紹介するのは「スプシが変更されたら通知がChatworkへ届くGAS」です。

クライアントさんと共有しているスプレッドシートですが、必要がないときは見ないので、クライアントさんが追加・修正などをした場合、私たちはわからないんですよね。

そのために毎日スプシ見るのも時間の無駄かなと思って、何か変更があればChatworkへ通知が来るようにGASを組んでみました。

スプシの機能でメール通知はありますがメールではなくChatworkへ届けたかったのでGASを使いました。


GASスクリプト例

// スクリプトプロパティからAPIトークンとルームIDを取得
// 事前に「スクリプトプロパティ」にCHATWORK_API_TOKENとCHATWORK_ROOM_IDを設定してください。
var CHATWORK_API_TOKEN = PropertiesService.getScriptProperties().getProperty('CHATWORK_API_TOKEN');
var CHATWORK_ROOM_ID = PropertiesService.getScriptProperties().getProperty('CHATWORK_ROOM_ID');

// 通知の再試行回数と間隔
var MAX_RETRIES = 3;
var RETRY_INTERVAL = 5 * 60 * 1000; // 5分

// スプレッドシート全体の編集を監視して通知を送信
function onEdit(e) {
  if (!e || e.authMode === ScriptApp.AuthMode.NONE) {
    Logger.log('シンプルなトリガーまたは手動実行です。処理を終了します。');
    return;
  }

  try {
    var sheet = e.source.getActiveSheet();
    var range = e.range;
    var row = range.getRow();
    var column = range.getColumn();
    var newValue = range.getValue();

    // 編集されたセルの情報を取得
    var editedCellInfo = 'シート名: ' + sheet.getName() + 
                         ', 行: ' + row + 
                         ', 列: ' + column + 
                         ', 新しい値: ' + newValue;

    Logger.log('編集が検出されました: ' + editedCellInfo);

    // ChatWorkまたはメールで通知を送信
    var message = 'スプレッドシートの内容が変更されました。\n\n' + editedCellInfo;
    sendNotificationWithRetry(message);

  } catch (error) {
    Logger.log('スクリプトの実行中にエラーが発生しました: ' + error.message);
    sendErrorNotification(error);
  }
}

// 通知を再試行しながら送信
function sendNotificationWithRetry(message, retryCount = 0) {
  if (retryCount >= MAX_RETRIES) {
    Logger.log('最大再試行回数に達しました。バックアップ通知を送信します。');
    sendBackupNotification(message);
    return;
  }

  var result = sendChatworkNotification(CHATWORK_API_TOKEN, CHATWORK_ROOM_ID, message);
  if (!result.success) {
    Logger.log('送信が失敗しました。' + (retryCount + 1) + '回目の再試行を' + (RETRY_INTERVAL / 60000) + '分後に実行します。');
    ScriptApp.newTrigger('retryNotification')
      .timeBased()
      .after(RETRY_INTERVAL)
      .create();

    PropertiesService.getScriptProperties().setProperties({
      'message': message,
      'retryCount': retryCount + 1
    });
  }
}

// 再試行トリガーの処理
function retryNotification() {
  var props = PropertiesService.getScriptProperties();
  var message = props.getProperty('message');
  var retryCount = parseInt(props.getProperty('retryCount'));

  sendNotificationWithRetry(message, retryCount);

  // このトリガーを削除
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === 'retryNotification') {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

// ChatWorkで通知を送信
function sendChatworkNotification(apiToken, roomId, message) {
  if (!apiToken || !roomId) {
    Logger.log('ChatWork API トークンまたはルームIDが設定されていません。');
    return { success: false, response: { code: 500, body: 'API token or room ID is not set' } };
  }

  try {
    var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
    var options = {
      'method': 'post',
      'headers': {
        'X-ChatWorkToken': apiToken
      },
      'payload': {
        'body': message
      },
      'muteHttpExceptions': true
    };

    Logger.log('ChatWorkに通知を送信中: ' + message);
    var response = UrlFetchApp.fetch(url, options);
    var responseCode = response.getResponseCode();
    var responseBody = response.getContentText();
    Logger.log('ChatWork APIレスポンス: ' + responseBody + '(ステータスコード: ' + responseCode + ')');

    return {
      success: responseCode === 200,
      response: {
        code: responseCode,
        body: responseBody
      }
    };
  } catch (error) {
    Logger.log('通知の送信中にエラーが発生しました: ' + error.message);
    return {
      success: false,
      response: {
        code: 500,
        body: error.message
      }
    };
  }
}

// バックアップ通知をメールで送信
function sendBackupNotification(message) {
  var recipient = 'backup@example.com'; // ダミーのメールアドレス
  var subject = 'ChatWork通知の送信に失敗しました';
  var body = 'ChatWorkへの通知送信に失敗しました。以下のメッセージを手動で送信してください:\n\n' + message;

  MailApp.sendEmail(recipient, subject, body);
  Logger.log('バックアップ通知をメールで送信しました: ' + recipient);
}

// エラー通知をメールで送信
function sendErrorNotification(error) {
  var recipient = 'admin@example.com'; // ダミーのメールアドレス
  var subject = 'GASスクリプトでエラーが発生しました';
  var body = 'スクリプトの実行中に以下のエラーが発生しました:\n\n' + error.message + '\n\nスタックトレース:\n' + error.stack;

  MailApp.sendEmail(recipient, subject, body);
  Logger.log('エラー通知をメールで送信しました: ' + recipient);
}

これ、ChatGPTが作ってくれました!私が使っているのとはちょっと違うので、もし動作しなかったらすみません。エラーをChatGPTに聞いたら修正してくれるのでぜひやってみてください。




該当のスプシに何か入力するとChatworkに通知が来ますし、加工すれば通知文も好きに指定できます。

私は、”〇番の請求書を発行する指示が来ました!”という通知文にして、スタッフと共有しています。

しかもPDFも簡単に出力できるようにもしてあるので、チェックしてクリックするだけで終わり。ホント一瞬で請求書発行が完了します。なので作業は1~5分になりました。

具体的なやり方は、興味がありそうだったらまた解説しますね!


いいなと思ったら応援しよう!

よこはまはるか
もしよければサポートお願いします!売上は、国内外の子ども達への寄付とさせていただきます。#チャイルドファンド活動しています

この記事が参加している募集