{"id":20198,"date":"2025-10-27T11:39:24","date_gmt":"2025-10-27T02:39:24","guid":{"rendered":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/?p=20198"},"modified":"2025-10-27T11:39:24","modified_gmt":"2025-10-27T02:39:24","slug":"%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%81%ae%e6%9d%a1%e4%bb%b6%e4%bb%98%e3%81%8d%e9%80%9a%e7%9f%a5%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%97%e3%81%a6%e6%a5%ad%e5%8b%99","status":"publish","type":"post","link":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/20198\/","title":{"rendered":"\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u6d3b\u7528\u3057\u3066\u696d\u52d9\u3092\u81ea\u52d5\u5316\u3059\u308b\u306b\u306f\uff1f\u8a2d\u5b9a\u65b9\u6cd5\u3092\u5fb9\u5e95\u89e3\u8aac"},"content":{"rendered":"<p>Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3067\u6761\u4ef6\u306b\u5fdc\u3058\u305f\u901a\u77e5\u3092\u884c\u3046\u306b\u306f\u3001\u6a19\u6e96\u306e\u300c\u901a\u77e5\u30eb\u30fc\u30eb\u300d\uff08\u7de8\u96c6\uff0f\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\uff09\u306b\u52a0\u3048\u3001Google Apps Script \u3084\u30a2\u30c9\u30aa\u30f3\u3067\u6761\u4ef6\u5224\u5b9a\u30fb\u901a\u77e5\u51e6\u7406\uff08\u30e1\u30fc\u30eb\uff0fSlack\u306a\u3069\uff09\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u91cd\u8981\u306a\u5909\u5316\u3092\u81ea\u52d5\u76e3\u8996\u3067\u304d\u3001\u7de8\u96c6\u30a4\u30d9\u30f3\u30c8\u306f\u5373\u6642\u3001\u8a08\u7b97\u7d50\u679c\u306e\u5909\u5316\u3084\u5916\u90e8\u30c7\u30fc\u30bf\u306f\u5206\u5358\u4f4d\u306e\u5b9a\u671f\u30c1\u30a7\u30c3\u30af\u306a\u3069\u3067\u628a\u63e1\u53ef\u80fd\u3067\u3059\u3002\u904b\u7528\u4e0a\u306f\u3001\u5fc5\u8981\u306a\u30c8\u30ea\u30ac\u30fc\u7a2e\u5225\u30fb\u983b\u5ea6\u30fb\u4e0a\u9650\u3092\u8003\u616e\u3057\u3066\u8a2d\u8a08\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u624b\u52d5\u3067\u306e\u30c7\u30fc\u30bf\u30c1\u30a7\u30c3\u30af\u304b\u3089\u89e3\u653e\u3055\u308c\u3001\u7570\u5e38\u5024\u306e\u65e9\u671f\u767a\u898b\u3001\u30bf\u30b9\u30af\u306e\u81ea\u52d5\u30ea\u30de\u30a4\u30f3\u30c9\u3001\u30c1\u30fc\u30e0\u9593\u306e\u60c5\u5831\u5171\u6709\u304c\u6539\u5584\u3055\u308c\u307e\u3059\u3002<\/p>\n<div id=\"post-below-intro\"><\/div><h2>\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3068\u306f\u4f55\u304b\uff1f<\/h2>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306f\u3001\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u5185\u306e\u7279\u5b9a\u306e\u6761\u4ef6\u304c\u6e80\u305f\u3055\u308c\u305f\u6642\u306b\u81ea\u52d5\u7684\u306b\u30e1\u30fc\u30eb\u3084\u30c1\u30e3\u30c3\u30c8\u30c4\u30fc\u30eb\u306b\u901a\u77e5\u3092\u9001\u4fe1\u3059\u308b\u6a5f\u80fd\u3067\u3001Google Apps Script\uff08GAS\uff09\u3084\u30a2\u30c9\u30aa\u30f3\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u3067\u304d\u3001\u696d\u52d9\u306e\u81ea\u52d5\u76e3\u8996\u3068\u8fc5\u901f\u306a\u5bfe\u5fdc\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u3053\u306e\u6a5f\u80fd\u306b\u3088\u308a\u300124\u6642\u9593365\u65e5\u30c7\u30fc\u30bf\u3092\u76e3\u8996\u3057\u3001\u91cd\u8981\u306a\u5909\u5316\u3092\u898b\u9003\u3059\u3053\u3068\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n<h3>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306e\u57fa\u672c\u6982\u5ff5\u3068\u4ed5\u7d44\u307f<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306f\u3001\u300c\u30c8\u30ea\u30ac\u30fc\u300d\u300c\u6761\u4ef6\u300d\u300c\u30a2\u30af\u30b7\u30e7\u30f3\u300d\u306e3\u3064\u306e\u8981\u7d20\u3067\u69cb\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/b><\/span>\u30c8\u30ea\u30ac\u30fc\u306f\u30c7\u30fc\u30bf\u306e\u5909\u66f4\u3084\u6642\u9593\u7d4c\u904e\u306a\u3069\u306e\u30a4\u30d9\u30f3\u30c8\u3001\u6761\u4ef6\u306f\u901a\u77e5\u3092\u9001\u308b\u304b\u3069\u3046\u304b\u3092\u5224\u65ad\u3059\u308b\u57fa\u6e96\u3001\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u5b9f\u969b\u306e\u901a\u77e5\u9001\u4fe1\u51e6\u7406\u3092\u6307\u3057\u307e\u3059\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001\u5728\u5eab\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u3001\u5546\u54c1\u306e\u5728\u5eab\u6570\u304c\u5909\u66f4\u3055\u308c\u305f\u6642\uff08\u30c8\u30ea\u30ac\u30fc\uff09\u3001\u5728\u5eab\u304c10\u500b\u4ee5\u4e0b\u306b\u306a\u3063\u305f\u5834\u5408\uff08\u6761\u4ef6\uff09\u3001\u7ba1\u7406\u8005\u306b\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3059\u308b\uff08\u30a2\u30af\u30b7\u30e7\u30f3\uff09\u3068\u3044\u3046\u6d41\u308c\u3067\u52d5\u4f5c\u3057\u307e\u3059\u3002\u3053\u306e\u4e00\u9023\u306e\u51e6\u7406\u306f\u5b8c\u5168\u306b\u81ea\u52d5\u5316\u3055\u308c\u3001\u4eba\u306e\u4ecb\u5165\u306a\u3057\u306b\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3067\u306f\u3001\u6a19\u6e96\u6a5f\u80fd\u3068\u3057\u3066\u300c\u901a\u77e5\u30eb\u30fc\u30eb\u300d\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u5b9f\u73fe\u3059\u308b\u306b\u306f\u3001Google Apps Script\u3092\u4f7f\u7528\u3057\u305f\u30ab\u30b9\u30bf\u30e0\u5b9f\u88c5\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002GAS\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u96d1\u306a\u6761\u4ef6\u8a2d\u5b9a\u3001\u8907\u6570\u306e\u901a\u77e5\u5148\u3078\u306e\u540c\u6642\u9001\u4fe1\u3001\u5916\u90e8\u30b5\u30fc\u30d3\u30b9\u3068\u306e\u9023\u643a\u306a\u3069\u3001\u67d4\u8edf\u306a\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3>\u6a19\u6e96\u306e\u901a\u77e5\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30e0\u901a\u77e5\u306e\u9055\u3044<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u6a19\u6e96\u901a\u77e5\u6a5f\u80fd\u306f\u3001\u300c\u30c4\u30fc\u30eb\u300d\u2192\u300c\u901a\u77e5\u30eb\u30fc\u30eb\u300d\u304b\u3089\u8a2d\u5b9a\u3067\u304d\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u30b7\u30fc\u30c8\u3092\u7de8\u96c6\u3057\u305f\u6642\u3084\u30d5\u30a9\u30fc\u30e0\u304c\u9001\u4fe1\u3055\u308c\u305f\u6642\u306b\u901a\u77e5\u3092\u9001\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/b><\/span>\u3057\u304b\u3057\u3001\u3053\u306e\u6a5f\u80fd\u306f\u5358\u7d14\u306a\u5909\u66f4\u901a\u77e5\u306b\u9650\u5b9a\u3055\u308c\u3001\u7279\u5b9a\u306e\u5024\u3084\u6761\u4ef6\u306b\u57fa\u3065\u304f\u901a\u77e5\u306f\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n<p>\u4e00\u65b9\u3001Google Apps Script\u3092\u4f7f\u7528\u3057\u305f\u30ab\u30b9\u30bf\u30e0\u901a\u77e5\u3067\u306f\u3001\u30bb\u30eb\u306e\u5024\u304c\u7279\u5b9a\u306e\u7bc4\u56f2\u3092\u8d85\u3048\u305f\u6642\u3001\u8907\u6570\u306e\u6761\u4ef6\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u8907\u96d1\u306a\u5224\u5b9a\u3001\u6642\u9593\u5e2f\u3092\u8003\u616e\u3057\u305f\u901a\u77e5\u5236\u5fa1\u3001\u901a\u77e5\u5185\u5bb9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306a\u3069\u3001\u696d\u52d9\u8981\u4ef6\u306b\u5408\u308f\u305b\u305f\u7d30\u304b\u3044\u5236\u5fa1\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u6a19\u6e96\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30e0\u901a\u77e5\u306e\u4f7f\u3044\u5206\u3051\u3068\u3057\u3066\u3001\u5358\u7d14\u306a\u7de8\u96c6\u901a\u77e5\u306a\u3089\u6a19\u6e96\u6a5f\u80fd\u3067\u5341\u5206\u3067\u3059\u304c\u3001\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u3092\u542b\u3080\u901a\u77e5\u304c\u5fc5\u8981\u306a\u5834\u5408\u306fGAS\u3067\u306e\u5b9f\u88c5\u304c\u63a8\u5968\u3055\u308c\u307e\u3059\u3002<\/p>\n<h3>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3067\u5b9f\u73fe\u3067\u304d\u308b\u81ea\u52d5\u5316<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u696d\u52d9\u81ea\u52d5\u5316\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u5728\u5eab\u7ba1\u7406\u3067\u306f\u3001\u6700\u5c0f\u5728\u5eab\u6570\u3092\u4e0b\u56de\u3063\u305f\u969b\u306e\u81ea\u52d5\u767a\u6ce8\u901a\u77e5\u3001\u8cde\u5473\u671f\u9650\u304c\u8fd1\u3044\u5546\u54c1\u306e\u30a2\u30e9\u30fc\u30c8\u3001\u7570\u5e38\u306a\u5728\u5eab\u5909\u52d5\u306e\u691c\u77e5\u3092\u884c\u3048\u307e\u3059\u3002\u58f2\u4e0a\u7ba1\u7406\u3067\u306f\u3001\u76ee\u6a19\u9054\u6210\u6642\u306e\u795d\u798f\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1\u3001\u524d\u65e5\u6bd4\u3067\u5927\u304d\u306a\u5909\u52d5\u304c\u3042\u3063\u305f\u5834\u5408\u306e\u901a\u77e5\u3001\u6708\u672b\u306e\u81ea\u52d5\u96c6\u8a08\u30ec\u30dd\u30fc\u30c8\u9001\u4fe1\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u7ba1\u7406\u306b\u304a\u3044\u3066\u306f\u3001\u30bf\u30b9\u30af\u306e\u671f\u9650\u524d\u30ea\u30de\u30a4\u30f3\u30c0\u30fc\u3001\u9032\u6357\u7387\u306b\u57fa\u3065\u304f\u30b9\u30c6\u30fc\u30bf\u30b9\u66f4\u65b0\u901a\u77e5\u3001\u62c5\u5f53\u8005\u5909\u66f4\u6642\u306e\u81ea\u52d5\u9023\u7d61\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u81ea\u52d5\u5316\u306b\u3088\u308a\u3001\u624b\u52d5\u3067\u306e\u30c1\u30a7\u30c3\u30af\u4f5c\u696d\u304c\u4e0d\u8981\u306b\u306a\u308a\u3001\u696d\u52d9\u52b9\u7387\u304c\u5927\u5e45\u306b\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n<h3>\u901a\u77e5\u5148\u3068\u9023\u643a\u53ef\u80fd\u306a\u30b5\u30fc\u30d3\u30b9<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306e\u9001\u4fe1\u5148\u306f\u3001\u30e1\u30fc\u30eb\u3060\u3051\u3067\u306a\u304f\u69d8\u3005\u306a\u30b5\u30fc\u30d3\u30b9\u3068\u9023\u643a\u3067\u304d\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u4e3b\u8981\u306a\u901a\u77e5\u5148\u3068\u3057\u3066\u3001Gmail\uff08\u500b\u4eba\u30fb\u30b0\u30eb\u30fc\u30d7\u30a2\u30c9\u30ec\u30b9\uff09\u3001Slack\uff08\u30c1\u30e3\u30f3\u30cd\u30eb\u30fb\u30c0\u30a4\u30ec\u30af\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\uff09\u3001Microsoft Teams\u3001LINE Notify\u3001Discord\u3001Chatwork\u306a\u3069\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001Webhook\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u72ec\u81ea\u306e\u30b7\u30b9\u30c6\u30e0\u3084API\u3068\u3082\u9023\u643a\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u8907\u6570\u306e\u901a\u77e5\u5148\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u7dca\u6025\u5ea6\u306b\u5fdc\u3058\u305f\u901a\u77e5\u306e\u4f7f\u3044\u5206\u3051\u3082\u53ef\u80fd\u3067\u3059\u3002\u4f8b\u3048\u3070\u3001\u91cd\u8981\u5ea6\u304c\u9ad8\u3044\u901a\u77e5\u306f\u30e1\u30fc\u30eb\u3068Slack\u306e\u4e21\u65b9\u306b\u9001\u4fe1\u3057\u3001\u5b9a\u671f\u7684\u306a\u5831\u544a\u306fSlack\u306e\u307f\u306b\u9001\u4fe1\u3059\u308b\u3068\u3044\u3063\u305f\u904b\u7528\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306e\u30e1\u30ea\u30c3\u30c8\u3068\u52b9\u679c<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u5c0e\u5165\u3059\u308b\u3053\u3068\u3067\u5f97\u3089\u308c\u308b\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8\u306f\u4ee5\u4e0b\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/b><\/span><\/p>\n<p>\u7de8\u96c6\u30a4\u30d9\u30f3\u30c8\u306f\u5373\u6642\u901a\u77e5\u304c\u53ef\u80fd\u3067\u3001\u8a08\u7b97\u7d50\u679c\u306e\u5909\u5316\u3084\u5916\u90e8\u30c7\u30fc\u30bf\u306e\u76e3\u8996\u306f\u5206\u5358\u4f4d\u306a\u3069\u306e\u5b9a\u671f\u30c1\u30a7\u30c3\u30af\u3067\u65e9\u671f\u691c\u77e5\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u8fc5\u901f\u306a\u5bfe\u5fdc\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002\u81ea\u52d5\u5316\u306b\u3088\u308a\u3001\u4eba\u7684\u30df\u30b9\u306e\u524a\u6e1b\u3068\u4f5c\u696d\u6642\u9593\u306e\u5927\u5e45\u306a\u77ed\u7e2e\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002\u53ef\u8996\u5316\u306b\u3088\u308a\u3001\u30c1\u30fc\u30e0\u5168\u4f53\u3067\u306e\u60c5\u5831\u5171\u6709\u304c\u6539\u5584\u3055\u308c\u3001\u610f\u601d\u6c7a\u5b9a\u30b9\u30d4\u30fc\u30c9\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n<p>\u6642\u9593\u4e3b\u5c0e\u30c8\u30ea\u30ac\u30fc\u3092\u7528\u3044\u306624\u6642\u9593\u4f53\u5236\u306e\u5b9a\u671f\u76e3\u8996\uff08\u4f8b\uff1a1\u5206\u301c\u6570\u5341\u5206\u9593\u9694\uff09\u3092\u4f4e\u30b3\u30b9\u30c8\u3067\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u4e0a\u9650\u3084\u9045\u5ef6\u306e\u53ef\u80fd\u6027\u3092\u8003\u616e\u3057\u3001\u91cd\u8981\u901a\u77e5\u306b\u306f\u5197\u9577\u30eb\u30fc\u30c8\u3084\u518d\u8a66\u884c\u30fb\u969c\u5bb3\u901a\u77e5\u3092\u8a2d\u3051\u308b\u3068\u5b89\u5fc3\u3067\u3059\u3002\u901a\u77e5\u306e\u9001\u4fe1\u5c65\u6b74\u306f\u3001Apps Script\u3067\u30ed\u30b0\u3092\u8a18\u9332\uff08\u4f8b\uff1a\u30ed\u30b0\u7528\u30b7\u30fc\u30c8\u30fbBigQuery\u30fb\u5916\u90e8\u30ed\u30b0\u57fa\u76e4\uff09\u3059\u308b\u3053\u3068\u3067\u3001\u5f8c\u304b\u3089\u306e\u78ba\u8a8d\u30fb\u5206\u6790\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u52b9\u679c\u306b\u3088\u308a\u3001\u696d\u52d9\u54c1\u8cea\u306e\u5411\u4e0a\u3068\u30b3\u30b9\u30c8\u524a\u6e1b\u3092\u540c\u6642\u306b\u9054\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3067\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u8a2d\u5b9a\u3059\u308b\u65b9\u6cd5\u306f\uff1f<\/h2>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306e\u8a2d\u5b9a\u306b\u306f\u3001Google Apps Script\u3067\u306e\u57fa\u672c\u5b9f\u88c5\u3001\u30c8\u30ea\u30ac\u30fc\u306e\u8a2d\u5b9a\u3001\u6761\u4ef6\u5f0f\u306e\u8a18\u8ff0\u3001\u901a\u77e5\u5185\u5bb9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3068\u3044\u30464\u3064\u306e\u30b9\u30c6\u30c3\u30d7\u304c\u3042\u308a\u3001\u6bb5\u968e\u7684\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u78ba\u5b9f\u306b\u52d5\u4f5c\u3059\u308b\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u9069\u5207\u306a\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u696d\u52d9\u8981\u4ef6\u306b\u5b8c\u5168\u306b\u5408\u81f4\u3057\u305f\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3>Google Apps Script\u3067\u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u5b9f\u88c5\u3059\u308b\u306b\u306f\u3001\u307e\u305aGoogle Apps Script\u30a8\u30c7\u30a3\u30bf\u3092\u958b\u304d\u307e\u3059\u3002<\/b><\/span>\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u304b\u3089\u300c\u62e1\u5f35\u6a5f\u80fd\u300d\u2192\u300cApps Script\u300d\u3092\u9078\u629e\u3057\u3001\u30b9\u30af\u30ea\u30d7\u30c8\u30a8\u30c7\u30a3\u30bf\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n<p>\u57fa\u672c\u7684\u306a\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n<p>function checkConditionAndNotify() {<\/p>\n<p>\/\/ \u5bfe\u8c61\u30b7\u30fc\u30c8\u3092\u660e\u793a\uff08\u30b7\u30fc\u30c8\u540d\u306f\u5b9f\u30c7\u30fc\u30bf\u306b\u5408\u308f\u305b\u3066\u5909\u66f4\uff09<\/p>\n<p>const ss = SpreadsheetApp.getActiveSpreadsheet();<\/p>\n<p>const sheet = ss.getSheetByName(&#8216;\u5728\u5eab&#8217;) || ss.getActiveSheet();<\/p>\n<p>const values = sheet.getDataRange().getValues(); \/\/ 1\u884c\u76ee\u306f\u30d8\u30c3\u30c0\u30fc<\/p>\n<p>for (let i = 1; i &lt; values.length; i++) {<\/p>\n<p>const [itemName, stockRaw, thresholdRaw, notified] = values[i];<\/p>\n<p>\/\/ \u3059\u3067\u306b\u901a\u77e5\u6e08\u307f\u306a\u3089\u30b9\u30ad\u30c3\u30d7<\/p>\n<p>if (String(notified).trim() === &#8216;\u901a\u77e5\u6e08&#8217;) continue;<\/p>\n<p>\/\/ \u6570\u5024\u5316\u3057\u3066\u5224\u5b9a\uff08\u672a\u5165\u529b\u3084\u975e\u6570\u5024\u306f\u9664\u5916\uff09<\/p>\n<p>const stock = Number(stockRaw);<\/p>\n<p>const threshold = Number(thresholdRaw);<\/p>\n<p>if (!Number.isFinite(stock) || !Number.isFinite(threshold)) continue;<\/p>\n<p>\/\/ \u6761\u4ef6\u30c1\u30a7\u30c3\u30af\uff1a\u5728\u5eab\u304c\u6700\u5c0f\u5728\u5eab\u6570\u3092\u4e0b\u56de\u3063\u305f\u5834\u5408<\/p>\n<p>if (stock &gt;= 0 &amp;&amp; stock &lt; threshold) {<\/p>\n<p>sendNotification(itemName, stock, threshold);<\/p>\n<p>\/\/ \u901a\u77e5\u6e08\u307f\u30d5\u30e9\u30b0\uff08D\u5217\uff09\u3092\u8a2d\u5b9a<\/p>\n<p>const rowIndex = i + 1; \/\/ \u884c\u756a\u53f7\uff081\u59cb\u307e\u308a\uff09<\/p>\n<p>sheet.getRange(rowIndex, 4).setValue(&#8216;\u901a\u77e5\u6e08&#8217;);<\/p>\n<p>sheet.getRange(rowIndex, 4).setBackground(&#8216;#ffcccc&#8217;);\u00a0 }}}<\/p>\n<p>function sendNotification(itemName, currentStock, minStock) {<\/p>\n<p>const recipient = &#8216;manager@example.com&#8217;;<\/p>\n<p>const subject = `\u3010\u5728\u5eab\u30a2\u30e9\u30fc\u30c8\u3011${itemName}\u306e\u5728\u5eab\u304c\u5c11\u306a\u304f\u306a\u3063\u3066\u3044\u307e\u3059`;<\/p>\n<p>const body = `<\/p>\n<p>${itemName}\u306e\u5728\u5eab\u304c\u6700\u5c0f\u5728\u5eab\u6570\u3092\u4e0b\u56de\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>\u73fe\u5728\u306e\u5728\u5eab\u6570\uff1a${currentStock}\u500b<\/p>\n<p>\u6700\u5c0f\u5728\u5eab\u6570\uff1a${minStock}\u500b<\/p>\n<p>\u65e9\u6025\u306b\u767a\u6ce8\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\uff1a${SpreadsheetApp.getActiveSpreadsheet().getUrl()}\u00a0\u00a0`;<\/p>\n<p>MailApp.sendEmail(recipient, subject, body);<\/p>\n<p>console.log(`\u901a\u77e5\u9001\u4fe1: ${itemName} &#8211; \u5728\u5eab: ${currentStock}`);}<\/p>\n<h3>\u30c8\u30ea\u30ac\u30fc\u306e\u7a2e\u985e\u3068\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>Google Apps Script\u3067\u306f\u3001\u69d8\u3005\u306a\u30c8\u30ea\u30ac\u30fc\u3092\u8a2d\u5b9a\u3057\u3066\u6761\u4ef6\u4ed8\u304d\u901a\u77e5\u3092\u81ea\u52d5\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002<\/b><\/span><\/p>\n<div class=\"summary-box\">\n<div class=\"summary-box__title\"><span class=\"summary-box__title_tag\"><strong>\u4e3b\u8981\u306a\u30c8\u30ea\u30ac\u30fc\u306e\u7a2e\u985e<\/strong><\/span><\/div>\n<ul class=\"summary-box__list summary-box__list\">\n<li>\u6642\u9593\u30d9\u30fc\u30b9\u30c8\u30ea\u30ac\u30fc\uff1a\u5b9a\u671f\u7684\u306a\u5b9f\u884c\uff08\u6bce\u6642\u3001\u6bce\u65e5\u3001\u6bce\u9031\u306a\u3069\uff09<\/li>\n<li>\u7de8\u96c6\u6642\u30c8\u30ea\u30ac\u30fc\uff1a\u30bb\u30eb\u304c\u7de8\u96c6\u3055\u308c\u305f\u6642\u306b\u5b9f\u884c<\/li>\n<li>\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u6642\u30c8\u30ea\u30ac\u30fc\uff1aGoogle\u30d5\u30a9\u30fc\u30e0\u304b\u3089\u56de\u7b54\u304c\u9001\u4fe1\u3055\u308c\u305f\u6642<\/li>\n<li>\u5909\u66f4\u6642\u30c8\u30ea\u30ac\u30fc\uff1a\u30b7\u30fc\u30c8\u306e\u69cb\u9020\u304c\u5909\u66f4\u3055\u308c\u305f\u6642<\/li>\n<li>\u30ab\u30b9\u30bf\u30e0\u30e1\u30cb\u30e5\u30fc\u30c8\u30ea\u30ac\u30fc\uff1a\u30e1\u30cb\u30e5\u30fc\u304b\u3089\u624b\u52d5\u5b9f\u884c<\/li>\n<\/ul>\n<\/div>\n<p>\u30c8\u30ea\u30ac\u30fc\u306e\u8a2d\u5b9a\u65b9\u6cd5\uff1a<\/p>\n<p>function setupTriggers() {<\/p>\n<p>\/\/ \u65e2\u5b58\u306e\u300c\u3053\u306e\u95a2\u6570\u5411\u3051\u300d\u306e\u30c8\u30ea\u30ac\u30fc\u306e\u307f\u524a\u9664\uff08\u5b89\u5168\uff09<\/p>\n<p>ScriptApp.getProjectTriggers()<\/p>\n<p>.filter(t =&gt; t.getHandlerFunction() === &#8216;checkConditionAndNotify&#8217; || t.getHandlerFunction() === &#8216;onEditNotification&#8217;)<\/p>\n<p>.forEach(t =&gt; ScriptApp.deleteTrigger(t));<\/p>\n<p>\/\/ \u6642\u9593\u30d9\u30fc\u30b9\u30c8\u30ea\u30ac\u30fc\uff08\u6bce\u65e5\u5348\u524d9\u6642\u306b\u5b9f\u884c\uff09<\/p>\n<p>ScriptApp.newTrigger(&#8216;checkConditionAndNotify&#8217;)<\/p>\n<p>.timeBased()<\/p>\n<p>.atHour(9)<\/p>\n<p>.everyDays(1)<\/p>\n<p>.create();<\/p>\n<p>\/\/ \u7de8\u96c6\u6642\u30c8\u30ea\u30ac\u30fc<\/p>\n<p>ScriptApp.newTrigger(&#8216;onEditNotification&#8217;)<\/p>\n<p>.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet().getId()) \/\/ ID\u3092\u6e21\u3059<\/p>\n<p>.onEdit()<\/p>\n<p>.create();<\/p>\n<p>\/\/ \u7de8\u96c6\u6642\u306e\u6761\u4ef6\u4ed8\u304d\u901a\u77e5<\/p>\n<p>function onEditNotification(e) {<\/p>\n<p>const range = e.range;<\/p>\n<p>const value = e.value;<\/p>\n<p>const sheet = range.getSheet();<\/p>\n<p>\/\/ \u7279\u5b9a\u306e\u5217\u304c\u7de8\u96c6\u3055\u308c\u305f\u5834\u5408\u306e\u307f\u51e6\u7406<\/p>\n<p>if (range.getColumn() === 2) { \/\/ B\u5217\uff08\u5728\u5eab\u6570\uff09\u304c\u7de8\u96c6\u3055\u308c\u305f\u5834\u5408<\/p>\n<p>const row = range.getRow();<\/p>\n<p>const itemName = sheet.getRange(row, 1).getValue();<\/p>\n<p>const threshold = sheet.getRange(row, 3).getValue();<\/p>\n<p>const stockNum = Number(value);<\/p>\n<p>const thresholdNum = Number(threshold);<\/p>\n<p>if (Number.isFinite(stockNum) &amp;&amp; Number.isFinite(thresholdNum) &amp;&amp; stockNum &lt; thresholdNum) {<\/p>\n<p>sendNotification(itemName, stockNum, thresholdNum);}}}<\/p>\n<h3>\u8907\u96d1\u306a\u6761\u4ef6\u5f0f\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u5b9f\u969b\u306e\u696d\u52d9\u3067\u306f\u3001\u5358\u7d14\u306a\u6bd4\u8f03\u3060\u3051\u3067\u306a\u304f\u3001\u8907\u6570\u306e\u6761\u4ef6\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u8907\u96d1\u306a\u5224\u5b9a\u304c\u5fc5\u8981\u306b\u306a\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u8907\u96d1\u306a\u6761\u4ef6\u5f0f\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n<p>function checkWarningConditions(row) {<\/p>\n<p>\/\/ B\u5217: \u73fe\u5728\u5728\u5eab, C\u5217: \u6700\u5927\/\u57fa\u6e96\u5728\u5eab, F\u5217: \u671f\u9650\u65e5<\/p>\n<p>const stock = Number(row[1]);<\/p>\n<p>const capacity = Number(row[2]);<\/p>\n<p>const expiry = toDate(row[5]);<\/p>\n<p>\/\/ \u6570\u5024\u30fb\u65e5\u4ed8\u306e\u59a5\u5f53\u6027\u30c1\u30a7\u30c3\u30af<\/p>\n<p>const stockRatio = (Number.isFinite(stock) &amp;&amp; Number.isFinite(capacity) &amp;&amp; capacity &gt; 0)<\/p>\n<p>? stock \/ capacity<\/p>\n<p>: NaN;<\/p>\n<p>const daysUntilExpiry = (expiry instanceof Date &amp;&amp; !isNaN(expiry))<\/p>\n<p>? daysUntil(expiry)<\/p>\n<p>: Infinity; \/\/ \u671f\u9650\u672a\u8a2d\u5b9a\u306f\u8b66\u544a\u6761\u4ef6\u304b\u3089\u9664\u5916<\/p>\n<p>return (Number.isFinite(stockRatio) &amp;&amp; stockRatio &lt;= 0.2) || daysUntilExpiry &lt;= 3;}<\/p>\n<p>\/\/ \u65e5\u4ed8\u30d8\u30eb\u30d1\u30fc<\/p>\n<p>function toDate(v) {<\/p>\n<p>\/\/ Date\u578b\u306a\u3089\u305d\u306e\u307e\u307e\u3001\u6587\u5b57\u5217\u306fDate\u306b\u5909\u63db\u3001\u6570\u5024(\u30b7\u30ea\u30a2\u30eb)\u306b\u3082\u5bfe\u5fdc<\/p>\n<p>if (v instanceof Date) return v;<\/p>\n<p>if (typeof v === &#8216;number&#8217;) return new Date(Math.round((v &#8211; 25569) * 86400 * 1000)); \/\/ \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u5e8f\u6570\u5bfe\u5fdc<\/p>\n<p>if (typeof v === &#8216;string&#8217;) return new Date(v);<\/p>\n<p>return new Date(&#8216;Invalid&#8217;);}<\/p>\n<p>function daysUntil(d) {<\/p>\n<p>const today = new Date();<\/p>\n<p>\/\/ \u6642\u523b\u306e\u5f71\u97ff\u3092\u907f\u3051\u308b\u305f\u3081\u65e5\u4ed8\u4e38\u3081<\/p>\n<p>today.setHours(0,0,0,0);<\/p>\n<p>const target = new Date(d.getFullYear(), d.getMonth(), d.getDate());<\/p>\n<p>return Math.ceil((target &#8211; today) \/ 86400000);}<\/p>\n<p>function checkUrgentConditions(row) {<\/p>\n<p>\/\/ \u7dca\u6025\u6761\u4ef6\uff1a\u5728\u5eab0 AND \u6ce8\u6587\u3042\u308a<\/p>\n<p>const stock = Number(row[1]); \u00a0 \/\/ \u5728\u5eab<\/p>\n<p>const orders = Number(row[4]);\u00a0 \/\/ \u672a\u51fa\u8377\u6ce8\u6587\u6570\u306a\u3069<\/p>\n<p>return Number.isFinite(stock) &amp;&amp; Number.isFinite(orders) &amp;&amp; stock === 0 &amp;&amp; orders &gt; 0;}<\/p>\n<p>function checkInfoConditions(row) {<\/p>\n<p>\/\/ \u60c5\u5831\u6761\u4ef6\uff1a\u5728\u5eab\u304c50%\u4ee5\u4e0b<\/p>\n<p>const stock = Number(row[1]);<\/p>\n<p>const capacity = Number(row[2]);<\/p>\n<p>if (!Number.isFinite(stock) || !Number.isFinite(capacity) || capacity &lt;= 0) return false;<\/p>\n<p>const stockRatio = stock \/ capacity;<\/p>\n<p>return stockRatio &lt;= 0.5;}<\/p>\n<p>function complexConditionCheck() {<\/p>\n<p>const ss = SpreadsheetApp.getActiveSpreadsheet();<\/p>\n<p>const sheet = ss.getSheetByName(&#8216;\u5728\u5eab&#8217;) || ss.getActiveSheet(); \/\/ \u30b7\u30fc\u30c8\u540d\u306f\u5b9f\u30c7\u30fc\u30bf\u306b\u5408\u308f\u305b\u3066\u5909\u66f4<\/p>\n<p>const data = sheet.getDataRange().getValues();<\/p>\n<p>\/\/ &#8230;}<\/p>\n<h3>\u901a\u77e5\u5185\u5bb9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u901a\u77e5\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u53d7\u4fe1\u8005\u306b\u3068\u3063\u3066\u5206\u304b\u308a\u3084\u3059\u304f\u3001\u30a2\u30af\u30b7\u30e7\u30f3\u53ef\u80fd\u306a\u5185\u5bb9\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>\u9ad8\u5ea6\u306a\u901a\u77e5\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306e\u5b9f\u88c5\uff1a<\/p>\n<p>function createCustomNotification(data, type) {<\/p>\n<p>const sheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();<\/p>\n<p>\/\/ \u30c7\u30fc\u30bf\u306f\u5ff5\u306e\u305f\u3081\u30a8\u30b9\u30b1\u30fc\u30d7<\/p>\n<p>const safe = {<\/p>\n<p>itemName: escapeHtml(String(data.itemName ?? &#8221;)),<\/p>\n<p>currentValue: escapeHtml(String(data.currentValue ?? &#8221;)),<\/p>\n<p>threshold: escapeHtml(String(data.threshold ?? &#8221;))};<\/p>\n<p>const htmlBody = `<\/p>\n<p>&lt;div style=&#8221;font-family: Arial, sans-serif; max-width: 600px;&#8221;&gt;<\/p>\n<p>&lt;div style=&#8221;background-color: ${getColorByType(type)}; color: white; padding: 10px;&#8221;&gt;<\/p>\n<p>&lt;h2 style=&#8221;margin:0;&#8221;&gt;${escapeHtml(getHeaderByType(type))}&lt;\/h2&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<p>&lt;div style=&#8221;padding: 20px; background-color: #f9f9f9;&#8221;&gt;<\/p>\n<p>&lt;h3&gt;\u8a73\u7d30\u60c5\u5831&lt;\/h3&gt;<\/p>\n<p>&lt;table style=&#8221;width: 100%; border-collapse: collapse;&#8221;&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;&lt;strong&gt;\u9805\u76ee\u540d&lt;\/strong&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;${safe.itemName}&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;&lt;strong&gt;\u73fe\u5728\u5024&lt;\/strong&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;${safe.currentValue}&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;&lt;strong&gt;\u57fa\u6e96\u5024&lt;\/strong&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;${safe.threshold}&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;&lt;strong&gt;\u63a8\u5968\u30a2\u30af\u30b7\u30e7\u30f3&lt;\/strong&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td style=&#8221;padding: 8px; border: 1px solid #ddd;&#8221;&gt;${escapeHtml(getRecommendedAction(data, type))}&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;p style=&#8221;margin-top: 20px;&#8221;&gt;<\/p>\n<p>&lt;a href=&#8221;${sheetUrl}&#8221; style=&#8221;background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;&#8221;&gt;<\/p>\n<p>\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3092\u958b\u304f<\/p>\n<p>&lt;\/a&gt;<\/p>\n<p>&lt;\/p&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<p>`;<\/p>\n<p>return htmlBody;}<\/p>\n<p>function getColorByType(type) {<\/p>\n<p>const colors = { urgent: &#8216;#ff4444&#8217;, warning: &#8216;#ffaa00&#8217;, info: &#8216;#4444ff&#8217; };<\/p>\n<p>return colors[type] || &#8216;#888888&#8217;;}<\/p>\n<p>function getHeaderByType(type) {<\/p>\n<p>switch (type) {<\/p>\n<p>case &#8216;urgent&#8217;:\u00a0 return &#8216;\u3010\u81f3\u6025\u5bfe\u5fdc\u3011\u91cd\u8981\u30a2\u30e9\u30fc\u30c8&#8217;;<\/p>\n<p>case &#8216;warning&#8217;: return &#8216;\u3010\u6ce8\u610f\u3011\u8b66\u544a\u901a\u77e5&#8217;;<\/p>\n<p>case &#8216;info&#8217;:\u00a0 \u00a0 return &#8216;\u60c5\u5831\u901a\u77e5&#8217;;<\/p>\n<p>default:\u00a0 \u00a0 \u00a0 \u00a0 return &#8216;\u901a\u77e5&#8217;;}}<\/p>\n<p>function getRecommendedAction(data, type) {<\/p>\n<p>\/\/ \u4f8b\uff1a\u5728\u5eab\u30a2\u30e9\u30fc\u30c8\u60f3\u5b9a<\/p>\n<p>const stock = Number(data.currentValue);<\/p>\n<p>const threshold = Number(data.threshold);<\/p>\n<p>if (type === &#8216;urgent&#8217;) return &#8216;\u81f3\u6025\u3001\u88dc\u5145\u307e\u305f\u306f\u4ee3\u66ff\u6848\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#8217;;<\/p>\n<p>if (type === &#8216;warning&#8217;) {<\/p>\n<p>if (Number.isFinite(stock) &amp;&amp; Number.isFinite(threshold) &amp;&amp; stock &lt; threshold)<\/p>\n<p>return &#8216;\u88dc\u5145\u767a\u6ce8\u3092\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002&#8217;;<\/p>\n<p>return &#8216;\u72b6\u6cc1\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#8217;;}<\/p>\n<p>return &#8216;\u72b6\u6cc1\u3092\u5171\u6709\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u5bfe\u5fdc\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#8217;;}<\/p>\n<p>function escapeHtml(s) {<\/p>\n<p>return s<\/p>\n<p>.replace(\/&amp;\/g,&#8217;&amp;amp;&#8217;)<\/p>\n<p>.replace(\/&lt;\/g,&#8217;&amp;lt;&#8217;)<\/p>\n<p>.replace(\/&gt;\/g,&#8217;&amp;gt;&#8217;)<\/p>\n<p>.replace(\/&#8221;\/g,&#8217;&amp;quot;&#8217;)<\/p>\n<p>.replace(\/&#8217;\/g,&#8217;&amp;#39;&#8217;);}<\/p>\n<h3>Slack\u9023\u643a\u3067\u306e\u901a\u77e5\u5b9f\u88c5<\/h3>\n<p><span style=\"background-color: #ffff99;\"><b>\u30e1\u30fc\u30eb\u3060\u3051\u3067\u306a\u304f\u3001Slack\u3078\u306e\u901a\u77e5\u3082\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/b><\/span><\/p>\n<p>Slack\u901a\u77e5\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n<p>function sendSlackNotification(message\/* , channel *\/) {<\/p>\n<p>const webhookUrl = PropertiesService.getScriptProperties().getProperty(&#8216;SLACK_WEBHOOK_URL&#8217;); \/\/ \u63a8\u5968\uff1a\u30d7\u30ed\u30d1\u30c6\u30a3\u306b\u4fdd\u5b58<\/p>\n<p>if (!webhookUrl) throw new Error(&#8216;SLACK_WEBHOOK_URL \u304c\u672a\u8a2d\u5b9a\u3067\u3059&#8217;);<\/p>\n<p>const payload = {<\/p>\n<p>\/\/ channel \u306f\u7701\u7565\uff08\u591a\u304f\u306e Incoming Webhook \u3067\u306f\u7121\u8996\u3055\u308c\u308b\u305f\u3081\uff09<\/p>\n<p>username: &#8216;\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u901a\u77e5Bot&#8217;,<\/p>\n<p>icon_emoji: &#8216;:bar_chart:&#8217;,<\/p>\n<p>attachments: [{<\/p>\n<p>color: message.color || &#8216;warning&#8217;, \/\/ &#8216;good&#8217; | &#8216;warning&#8217; | &#8216;danger&#8217; | &#8216;#RRGGBB&#8217;<\/p>\n<p>title: message.title,<\/p>\n<p>text: message.text,<\/p>\n<p>fields: message.fields || [],<\/p>\n<p>footer: &#8216;Google Sheets&#8217;,<\/p>\n<p>ts: Math.floor(Date.now() \/ 1000) }]\u00a0};<\/p>\n<p>const options = {<\/p>\n<p>method: &#8216;post&#8217;,<\/p>\n<p>contentType: &#8216;application\/json&#8217;,<\/p>\n<p>payload: JSON.stringify(payload),<\/p>\n<p>muteHttpExceptions: true};<\/p>\n<p>const res = UrlFetchApp.fetch(webhookUrl, options);<\/p>\n<p>if (res.getResponseCode() &gt;= 300) {<\/p>\n<p>throw new Error(`Slack webhook error: ${res.getResponseCode()} ${res.getContentText()}`); }}<\/p>\n<p>try {<\/p>\n<p>UrlFetchApp.fetch(webhookUrl, options);<\/p>\n<p>console.log(&#8216;Slack\u901a\u77e5\u9001\u4fe1\u6210\u529f&#8217;);<\/p>\n<p>} catch (error) {<\/p>\n<p>console.error(&#8216;Slack\u901a\u77e5\u9001\u4fe1\u5931\u6557:&#8217;, error);<\/p>\n<p>\/\/ \u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\u3068\u3057\u3066\u30e1\u30fc\u30eb\u9001\u4fe1\uff08\u5b9a\u7fa9\u6e08\u307f\u306e\u95a2\u6570\u3092\u547c\u3076\uff09<\/p>\n<p>MailApp.sendEmail({<\/p>\n<p>to: &#8216;admin@example.com&#8217;,<\/p>\n<p>subject: &#8216;\u3010\u969c\u5bb3\u3011Slack\u901a\u77e5\u306b\u5931\u6557\u3057\u307e\u3057\u305f&#8217;,<\/p>\n<p>htmlBody: `<\/p>\n<p>&lt;p&gt;Slack\u901a\u77e5\u306e\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002&lt;\/p&gt;<\/p>\n<p>&lt;pre&gt;${escapeHtml(String(error))}&lt;\/pre&gt;<\/p>\n<p>&lt;pre&gt;${escapeHtml(JSON.stringify(message))}&lt;\/pre&gt;\u00a0 `\u00a0});}<\/p>\n<p>\u203b \u8907\u6570\u30c1\u30e3\u30f3\u30cd\u30eb\u3078\u9001\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001Bot Token + chat.postMessage API \u306e\u5229\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\uff08Incoming Webhook\u3067\u306f\u5236\u7d04\u304c\u3042\u308b\u305f\u3081\uff09\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3067\u6761\u4ef6\u306b\u5fdc\u3058\u305f\u901a\u77e5\u3092\u884c\u3046\u306b\u306f\u3001\u6a19\u6e96\u306e\u300c\u901a\u77e5\u30eb\u30fc\u30eb\u300d\uff08\u7de8\u96c6\uff0f\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\uff09\u306b\u52a0\u3048\u3001Google Apps Script \u3084\u30a2\u30c9\u30aa\u30f3\u3067\u6761\u4ef6\u5224\u5b9a\u30fb\u901a\u77e5\u51e6\u7406\uff08\u30e1\u30fc\u30eb\uff0fSlack\u306a\u3069\uff09\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002\u3053\u308c [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[51],"tags":[],"class_list":["post-20198","post","type-post","status-publish","format-standard","hentry","category-excel"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/posts\/20198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/comments?post=20198"}],"version-history":[{"count":8,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/posts\/20198\/revisions"}],"predecessor-version":[{"id":20567,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/posts\/20198\/revisions\/20567"}],"wp:attachment":[{"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/media?parent=20198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/categories?post=20198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/biz.moneyforward.com\/work-efficiency\/basic\/wp-json\/wp\/v2\/tags?post=20198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}