<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>GAS(GoogleAppsScript) | 文系出身のSEですが、何か</title>
	<atom:link href="https://loosecarrot.com/category/se%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2/gasgoogleappsscript/feed/" rel="self" type="application/rss+xml" />
	<link>https://loosecarrot.com</link>
	<description>文系(国際系)出身でSE就職のサラリーマンが プログラミング・海外旅行・語学・健康などに関する情報を発信します</description>
	<lastBuildDate>Sun, 15 Jan 2023 10:32:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.8</generator>

<image>
	<url>https://loosecarrot.com/wp-content/uploads/2020/08/cropped-8214a4f1973e7caf419465b3dcc3ffd7-32x32.png</url>
	<title>GAS(GoogleAppsScript) | 文系出身のSEですが、何か</title>
	<link>https://loosecarrot.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">151273272</site>	<item>
		<title>GoogleSpreadSheetからCSVを出力する</title>
		<link>https://loosecarrot.com/2023/01/15/5894/</link>
					<comments>https://loosecarrot.com/2023/01/15/5894/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sun, 15 Jan 2023 09:56:49 +0000</pubDate>
				<category><![CDATA[GAS(GoogleAppsScript)]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=5894</guid>

					<description><![CDATA[<p>スプレッドシートを使って作ったファイルをCSVにしてファイル取り込みする業務があったので、CSVを出力するツールを作成してみました。 列や行が増えても減っても問題なく出力できるので、ぜひ利用使ってみて下さい。 使い方 使</p>
The post <a href="https://loosecarrot.com/2023/01/15/5894/">GoogleSpreadSheetからCSVを出力する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-5896" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_1.png" alt="" width="800" height="400" />
<p>スプレッドシートを使って作ったファイルをCSVにしてファイル取り込みする業務があったので、CSVを出力するツールを作成してみました。</p>
<p><span style="color: #ff0000;">列や行が増えても減っても問題なく出力できる</span>ので、ぜひ利用使ってみて下さい。</p>
<h2>使い方</h2>
<img decoding="async" class="alignnone size-full wp-image-5436" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_5.jpg" alt="" width="800" height="400" />
<p>使い方とスプレッドシートツールの仕様を解説します。</p>
<h3>GoogleSpreadSheetをコピーしておく</h3>
<p>以下からSpreadSheetを開きます。</p>
<p><a href="https://docs.google.com/spreadsheets/d/1Qs5CRTIWvtpIaCBLyMdMltQtusn7TNYMuiMrVBqb2W8/edit#gid=875924104" target="_blank" rel="noopener">https://docs.google.com/spreadsheets/d/1Qs5CRTIWvtpIaCBLyMdMltQtusn7TNYMuiMrVBqb2W8/edit#gid=875924104</a></p>
<p><span style="color: #ff0000;">閲覧専用なので、コピーして保存をしてください。</span></p>
<p>「ファイル」→「コピーを作成」の順で保存できます。</p>
<img decoding="async" class="alignnone size-full wp-image-5901" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_5.png" alt="" width="330" height="168" />
<p>これで、編集ができるようになります。</p>
<h3>スプレッドシートの仕様</h3>
<p>「出力元シート」に入力したデータがCSVとして出力されます。</p>
<p>■出力される場所</p>
<p>スプレッドシートが存在している場所と同じ場所にCSVが出力されます。</p>
<p>■出力される範囲</p>
<p>入力した最終列×最終行のデータです。</p>
<p><span style="color: #ff0000;">そのため、列や行数は変わった場合、変わった分だけCSVにも反映されます。</span></p>
<p>■文字コード</p>
<p>Shift-JISです。</p>
<h3>出力方法</h3>
<p>出力ボタンをクリックします。</p>
<h4>①成功した場合</h4>
<p>CSVダウンロードURLが表示されます。</p>
<p>赤枠箇所をクリックしてください。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5899" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_3.png" alt="" width="709" height="155" />
<p>その後、右上のダウンロードボタンを押すとCSVがダウンロードできます。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5900" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4.png" alt="" width="1114" height="155" srcset="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4.png 1114w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4-300x42.png 300w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4-1024x142.png 1024w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4-768x107.png 768w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_4.png 856w" sizes="(max-width: 1114px) 100vw, 1114px" />
<p>出力場所はスプレッドシートがある場所と同じフォルダです。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5913" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_10.png" alt="" width="927" height="441" srcset="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_10.png 927w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_10-300x143.png 300w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_10-768x365.png 768w, https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_10.png 856w" sizes="(max-width: 927px) 100vw, 927px" />
<h4>②出力が失敗した場合</h4>
<p>エラーメッセージが表示されます。</p>
<p>プログラムが読める方に確認をお願いします。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5898" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_2.png" alt="" width="844" height="161" />
<h3>初めて実行する場合、実行承認・許可が必要</h3>
<p>「出力」ボタンを始めて押した場合、メッセージが表示されます。</p>
<p>以下の順で許可をしてください。</p>
<p>①続行をクリック</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5903" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_6.png" alt="" width="373" height="120" />
<p>②使っているGoogleアカウントを選んでログイン</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5904" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_7.png" alt="" width="401" height="174" />
<p>③詳細をクリックして、「安全ではないページに移動」</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5905" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_8.png" alt="" width="420" height="323" />
<p>④一番下の許可を押す</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5902" src="https://loosecarrot.com/wp-content/uploads/2023/01/GoogleSpreadSheetからCSVを出力する_9.png" alt="" width="475" height="803" />
<h2>コード解説</h2>
<h3>ソースコード</h3>
<p>コードも公開しておきます。</p>
<p>もちろんスプレッドシートから開くこともできます。</p><pre class="urvanov-syntax-highlighter-plain-tag">/**
 * CSV出力する
 */
function functionOutputCSV() 
{
  try
  {
    var csvOutputData = {}
    var outputSheet = ""
    let menuSheet =""
    var fileId = ""
    var folderId = ""
    
    //シート情報をセット
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出力元シート").activate();
    outputSheet = SpreadsheetApp.getActiveSheet();
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メニュー").activate();
    //menuSheet = SpreadsheetApp.getActiveSheet();

    //エラー出力セルをクリア
    menuSheet.getRange(3, 3).setValue("");
    //csvULRセルをクリア
    menuSheet.getRange(2, 3).setValue("");

    //▼▼▼▼▼▼▼CSV出力する範囲を取得▼▼▼▼▼▼▼
    //最終列を取得する(行の先頭列から右方向に取得する)
    var lastCol = outputSheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
    //A列の最終行のセルを取得(先頭行から下方向に取得する)
    var lastRow = outputSheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
    //CSV出力する範囲を取得
    var outputRange = outputSheet.getRange(1, 1, lastRow, lastCol);
    //▲▲▲▲▲▲▲CSV出力する範囲を取得▲▲▲▲▲▲▲

    
    //▼▼▼▼▼▼▼出力範囲のデータを文字で区切る▼▼▼▼▼▼▼
    //配列へシート全体を読み込む
    var values = outputSheet.getDataRange().getValues()
  
    //二次元配列をカンマ区切りの文字列に変換
    csvOutputData = values.join('\n');
    //▲▲▲▲▲▲▲出力範囲のデータを文字で区切る▲▲▲▲▲▲▲


    //▼▼▼▼▼▼▼スプレッドシートと同じフォルダにCSVを出力する▼▼▼▼▼▼▼
    //ファイル名セット
    var now = new Date(); //現在日時を取得
    var fileName ="出力CSV" +Utilities.formatDate(now, 'JST', 'yyyyMMdd-HHmmss') + ".csv"
    
    //スプレッドシートのあるフォルダID取得
    folderId = getSSFolderId()

    //CSVを同じフォルダに出力
    fileId = createCsvFile_(folderId,fileName,csvOutputData)

    //CSVのURLをスプレッドシートに記入
    menuSheet.getRange(2, 3).setValue("https://drive.google.com/file/d/"+fileId);

    //▲▲▲▲▲▲▲スプレッドシートと同じフォルダにCSVを出力する▲▲▲▲▲▲▲
  }
  catch (e)
  {
    //エラーをメニューシートに記入する
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メニュー").activate();
    menuSheet = SpreadsheetApp.getActiveSheet();
    menuSheet.getRange(3, 3).setValue("エラー：" + e.message + "\n情報：" + e.stack);
  }
}



/**
 * CSVファイル書き出し
 * @param {string} folderId フォルダID
 * @param {string} fileName ファイル名
 * @param {string} contents ファイルの内容
 * @return {string} 出力したファイルのID
 */
function createCsvFile_(folderId, fileName, contents) {  

  // コンテンツタイプ
  const contentType = 'text/plain';

  // 文字コード
  //const charset = 'UTF-8';
  const charset = 'Shift_JIS';

  // 出力するフォルダ
  const folder = DriveApp.getFolderById(folderId);

  // Blob を作成する
  const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(contents, charset);

  // ファイルに保存
  var file = folder.createFile(blob);

  //出力したCSVファイルのファイルIDを取得
  fileId = file.getId();
  return fileId;

}


/**
 * スプレッドシート自身のフォルダIDを取得する
 * @return {string} スプレッドシートが存在しているフォルダのID
 */
function getSSFolderId() {  

    // 自身のスプレッドシートのIDを取得
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ssId = ss.getId(); // スプレッドシートIDを取得
    var parentFolder = DriveApp.getFileById(ssId).getParents(); // IDからスプレッドシートのファイルを取得⇒親フォルダを取得
    var folderId = parentFolder.next().getId(); // 親フォルダIDを取得

    return folderId;
}</pre><p></p>
<h3>全体解説</h3>
<p>流れとしては以下のようになっています。</p>
<p>①CSV出力する範囲を取得(25行目～32行目)</p>
<p>②出力範囲のデータを文字で区切る(35行目～41行目)</p>
<p>③スプレッドシートと同じフォルダにCSVを出力する(25行目～32行目)</p>
<div class="concept-box2">
<p>サンプルの個人情報データは以下から作っているダミーデータです。</p>
<p><a href="https://testdata.userlocal.jp/" target="_blank" rel="noopener">個人情報テストデータジェネレーター</a></p>
</div>
<div class="concept-box5">
<p>・【GAS】1行で書ける！特定列の最終行・特定行の最終列を取得する方法<br />
<a href="https://moripro.net/gas-get-specified-lastcol-lastrow/" target="_blank" rel="noopener">https://moripro.net/gas-get-specified-lastcol-lastrow/</a></p>
<p>・【GASで時短】選択範囲のデータをCSVで出力する<a href="https://myfunc.jp/items/00041/index.html" target="_blank" rel="noopener">https://myfunc.jp/items/00041/index.html</a><br />
・個人情報テストデータジェネレーター</p>
<p><a href="https://testdata.userlocal.jp/" target="_blank" rel="noopener">https://testdata.userlocal.jp/</a></p>
</div>
<p>&nbsp;</p>The post <a href="https://loosecarrot.com/2023/01/15/5894/">GoogleSpreadSheetからCSVを出力する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2023/01/15/5894/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5894</post-id>	</item>
		<item>
		<title>GoogleSpreadSheetから自動で予定をメールお知らせ</title>
		<link>https://loosecarrot.com/2022/01/23/5431/</link>
					<comments>https://loosecarrot.com/2022/01/23/5431/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sun, 23 Jan 2022 12:22:03 +0000</pubDate>
				<category><![CDATA[GAS(GoogleAppsScript)]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=5431</guid>

					<description><![CDATA[<p>予定がいっぱいあると、忘れてしまいがちなので、事前に通知してくれるアプリが欲しいと思っていました。 なので、以前C#で予定を登録して、自動でメール送信するアプリを作りました。 C#アプリ開発 メールお知らせアプリ 開発案</p>
The post <a href="https://loosecarrot.com/2022/01/23/5431/">GoogleSpreadSheetから自動で予定をメールお知らせ</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5573" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_1-2.jpg" alt="" width="800" height="400" />
<p>予定がいっぱいあると、忘れてしまいがちなので、事前に通知してくれるアプリが欲しいと思っていました。</p>
<p>なので、以前C#で予定を登録して、自動でメール送信するアプリを作りました。</p>
<a href="https://loosecarrot.com/2019/11/25/3860/" class="blog-card"><div class="blog-card-hl-box"><i class="jic jin-ifont-post"></i><span class="blog-card-hl"></span></div><div class="blog-card-box"><div class="blog-card-thumbnail"><img decoding="async" src="https://loosecarrot.com/wp-content/uploads/2019/11/2aad409f7fb9656e0a91f95c8fb2c1b7-1-320x180.png" class="blog-card-thumb-image wp-post-image" alt="" width ="162" height ="91" /></div><div class="blog-card-content"><span class="blog-card-title">C#アプリ開発 メールお知らせアプリ</span><span class="blog-card-excerpt">

開発案件の経験は2案件ほどで、ほとんど経験ありません。

そんな私が独学でプログラミングの勉強をしてきました。

そこで...</span></div></div></a>
<p>ただ、このアプリの難点は、PCを常に起動しておかないとメール送信が起動しないことです。(パソコンのタスクスケジューラでメール送信をするからです…)</p>
<p>サーバを借りるのも面倒だなと思い、GoogleSpreadSheetとGoogleAppsScriptで対応してみました。</p>
<p><a href="https://docs.google.com/spreadsheets/d/1rULHw4MEEfl6GZiwNdjPgr7S4ZYGQTNEqoAp5jHtUVk/edit?usp=sharing">スプレッドシートはこちらです。</a></p>
<h2>メール送信アプリの内容</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-5433" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_2.png" alt="" width="800" height="400" />GoogleSpreadSheetに予定とその日付などを入れておくと、設定した時間にメールに送信されるようになります。</p>
<p>時間指定でメール送信をする設定は、Googleのサーバ内に登録するので自分の<span style="color: #ff0000;">PCが起動していなくても、実行が可能</span>になります。</p>
<p>こんな感じで予定を入れておきます。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5434" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_3.png" alt="" width="408" height="210" />
<p>メールを送信する時間を設定しておくと、こんな感じでメールが送信されてきます。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5435" src="https://loosecarrot.com/wp-content/uploads/2022/01/IMG_6931.png" alt="" width="274" height="273" />
<h2>使い方</h2>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5436" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_5.jpg" alt="" width="800" height="400" />
<h3>GoogleSpreadSheetをコピー</h3>
<p>以下からSpreadSheetを開きます。</p>
<p><a href="https://docs.google.com/spreadsheets/d/1rULHw4MEEfl6GZiwNdjPgr7S4ZYGQTNEqoAp5jHtUVk/edit?usp=sharing">https://docs.google.com/spreadsheets/d/1rULHw4MEEfl6GZiwNdjPgr7S4ZYGQTNEqoAp5jHtUVk/edit?usp=sharing</a></p>
<p>閲覧専用なので、コピーして保存をしてください。</p>
<p>「ファイル」→「コピーを作成」の順で保存できます。</p>
<p>これで、編集ができるようになります。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5437" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_6.jpg" alt="" width="399" height="224" />
<h3>予定を記入する(イベントシート)</h3>
<p>イベントシートに予定、時間などを記入していってください。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5434" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_3.png" alt="" width="453" height="233" />
<h3>各設定を記入する(設定シート)</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5440" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_7-1.jpg" alt="" width="757" height="409" />
<p>設定シートに各設定を記入します。</p>
<p>各列の説明については、D列の備考・説明に記載してある通りです。</p>
<p>メール送信時間は、<span style="color: #ff0000;">通知時間は1日2回だけ設定可能</span>です。</p>
<h3>メール送信のトリガーをセットする</h3>
<p>設定シートの記入した「通知時間1」と「通知時間2」の時間にメール送信を起動させるためには、トリガーの設定をします。</p>
<h4>時間指定で起動するトリガーをセット</h4>
<p>①「拡張機能」→「Apps Script」をクリックします。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5442" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_9.jpg" alt="" width="301" height="178" />
<p>②左端にマウスを移動して、「トリガー」をクリック</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5443" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_10.jpg" alt="" width="412" height="254" />
<p>③「トリガーを追加」→設定を入れて保存</p>
<p>関数は「<span style="color: #ff0000;">setTriggers</span>」です。</p>
<p>時間は「<span style="color: #ff0000;">午前0時～1時</span>」にしておいて下さい。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5444" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_11.jpg" alt="" width="595" height="373" />
<p>初回のみトリガー保存時は認証が出るかもしれないので、認証しておいて下さい。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-5455" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_13.jpg" alt="" width="438" height="398" />
<h4>「不要トリガー削除」のトリガーをセット</h4>
<p>一日に何回もトリガーを実行すると、ごみのトリガーが溜まっていきます。</p>
<p>GoogleSpreadSheetが重くなる可能性があるので、自動で削除する設定をします。</p>
<p>設定方法は送信の設定とほとんど同じです。</p>
<p>関数は「<span style="color: #ff0000;">delTrigger</span>」</p>
<p>時間は「<span style="color: #ff0000;">午後11時～午前0時</span>」にしておいて下さい。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-5445" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_12.jpg" alt="" width="343" height="400" />
<h3>件名・本文(メールフォーマットシート)</h3>
<img loading="lazy" decoding="async" class="alignnone wp-image-5441" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_8.jpg" alt="" width="490" height="394" />
<p>件名、本文、署名は「メールフォーマットシート」から変更できます。</p>
<p>「設定シート」の「事前通知日数」を変更すると自動で反映されます。</p>
<h3>メール送信の仕様・注意</h3>
<p>●「作業シート」は処理に使うので、削除しないでください</p>
<p>●「イベントシート」の対象が「〇」になっているいベンドだけメールの送信がされます。</p>
<p>●「イベントシート」イベント名が入力されていないとメール送信対象になりません。</p>
<p>●送信対象は999行目までなので、定期的に削除しておいてください。</p>
<p>●日付順に並んで送信されます。</p>
<h2>ソースコード(GAS)を一部紹介</h2>
<p>キレイなソースではありませんので、ご容赦ください…</p><pre class="urvanov-syntax-highlighter-plain-tag">//=============================================='
//目的　　　 ：メール送信処理
//引数　　　 ：
//戻り値　　 ：
//=============================================='
function sendEmails()
{
  var sheetEvents;                    //イベントシート格納
  var sheetEventsData;                //イベントシートのデータ格納
  var sheetReceiverGroup;             //宛先グループシート格納
  var sheetWork                       //作業用シート
  var sheetWorkData                   //作業用シートデータ
  var sheetMainSettings               //設定シート
  var sheetMailFormat                 //メールフォーマットシート
  
  var dtNow;                          //現在時刻を取得
  var advanceNoticeDays;              //事前通知日数
  var ToAddr;                         //Toアドレス
  var CcAddr;                         //Ccアドレス
  var BccAddr;                        //Bccアドレス
  var subject;                        //件名
  var body;                           //本文
  var signature;                      //署名
  var workEventNameColNum;            //ワークシートのイベント名列番号
  var workDateColNum;                 //ワークシートの日付列番号
  var workEventPlaceColNum;           //ワークシートの場所列番号
  var workEventNoteColNum;            //ワークシートの内容列番号
  
  //▼▼▼▼▼メイン設定シートからのデータを取得▼▼▼▼▼
  // シートの取得
  sheetMainSettings = SpreadsheetApp.getActive().getSheetByName('設定');
  
  //名前定義から値を取得
  advanceNoticeDays = sheetMainSettings.getRange("事前通知日数").getValue();
  
  //To、CC取得
  ToAddr = sheetMainSettings.getRange("Toアドレス").getValue();
  CcAddr = sheetMainSettings.getRange("Ccアドレス").getValue();

  //▲▲▲▲▲設定シートからのデータを取得▲▲▲▲▲

  //▼▼▼▼▼イベントシートからのデータを取得▼▼▼▼▼
  //イベントシートの取得
  sheetEvents = SpreadsheetApp.getActive().getSheetByName('イベント');
  
  //イベントシートをアクティベート
  SpreadsheetApp.setActiveSheet(sheetEvents)
  
  // シートのデータを取得(2次元配列)
  sheetEventsData = sheetEvents.getSheetValues(3, 1, sheetEvents.getLastRow(), sheetEvents.getLastColumn());
  //▲▲▲▲▲イベントシートからのデータを取得▲▲▲▲▲
  
  //▼▼▼▼▼作業シートをクリア▼▼▼▼▼
  //作業シートを取得
  sheetWork = SpreadsheetApp.getActive().getSheetByName('作業シート');  
  
  //作業シートをクリア
  ClearSheet('作業シート');
  //▲▲▲▲▲作業シートをクリア▲▲▲▲▲
  
  //▼▼▼▼▼宛先グループごとにイベントシートからイベントを取得する▼▼▼▼▼
  //イベントシートをアクティベート
  SpreadsheetApp.setActiveSheet(sheetEvents);
  
  //イベントシート上で条件に使う列のアルファベットを取得
  var eventSendTargetCol = ColumnNoToLetter(getColNum("対象",2,1,2,sheetEvents.getLastColumn()));
  var eventNameCol = ColumnNoToLetter(getColNum("イベント名",2,1,2,sheetEvents.getLastColumn()));
  var eventDateCol = ColumnNoToLetter(getColNum("日付",2,1,2,sheetEvents.getLastColumn()));
  
  //現在時刻を取得
  dtNow = new Date();
  
  //日付の抽出条件を[現在日] + [設定で指定した日付]にセット
  var dtSearchTo = dtNow.setDate(dtNow.getDate()+advanceNoticeDays);
  dtSearchTo = Utilities.formatDate(dtNow,"JST","yyyy-MM-dd");

  //条件日付の変換
  dtSearchFrom = new Date();
  var dtSearchFrom = Utilities.formatDate(dtSearchFrom,"JST","yyyy-MM-dd");

  //作業シートに対象宛先グループのデータを出力
  //■条件
  //送信対象：〇
  //イベント名：NOT NULL
  //日付：現在日 &lt;= 日付 &lt;= 現在日-パラメータ
  var v = sheetWork.getRange("A1").setFormula
  ("=QUERY('イベント'!2:999,\"SELECT * WHERE "+eventSendTargetCol+" = '〇' AND "+eventNameCol+" IS NOT NULL AND "+eventDateCol+" &gt;= date '"+dtSearchFrom+"'\ AND "+eventDateCol+" &lt;= date '"+dtSearchTo+"' order by "+eventDateCol+" asc\",true)").getValues();
  
  //出力したイベントデータを取得
  //作業シートをアクティベート
  SpreadsheetApp.setActiveSheet(sheetWork);
  
  // シートのデータを取得(2次元配列)
  var sheetWorkData = sheetWork.getSheetValues(2, 1, sheetWork.getLastRow(), sheetWork.getLastColumn());
  //▲▲▲▲▲宛先グループごとにイベントシートからイベントを取得する▲▲▲▲▲
  
  //▼▼▼▼▼メール本文を作成する▼▼▼▼▼
  //イベントシート上で条件に使う列のアルファベットを取得
  workEventNameColNum = getColNum("イベント名",1,1,1,sheetWork.getLastColumn());
  workDateColNum = getColNum("日付",1,1,1,sheetWork.getLastColumn());
  workEventPlaceColNum = getColNum("場所",1,1,1,sheetWork.getLastColumn());
  workEventNoteColNum = getColNum("内容",1,1,1,sheetWork.getLastColumn());
  
  // シートの取得
  sheetMailFormat = SpreadsheetApp.getActive().getSheetByName('メールフォーマット');
 
  //名前定義から文言を取得
  subject = sheetMailFormat.getRange("件名").getValue();
  body = sheetMailFormat.getRange("本文").getValue();
  signature = sheetMailFormat.getRange("署名").getValue();
  
  //イベントデータからメール本文を作成
  sheetWorkData.forEach(function(value,item)
  {
    //イベント名が空白時はスキップ
    if(value[workEventNameColNum-1]!="")
    {
      body = body + "◆" + value[workEventNameColNum-1] + String.fromCharCode(10)
                  + "【日付】" + Utilities.formatDate(value[workDateColNum-1],"JST","yyyy-MM-dd") + String.fromCharCode(10)
                  + "【場所】" + value[workEventPlaceColNum-1] + String.fromCharCode(10)
                  + "【内容】" + value[workEventNoteColNum-1] + String.fromCharCode(10)+ String.fromCharCode(10);
    }       
  });
  body = body + signature;    
  //▲▲▲▲▲メール本文を作成する▲▲▲▲▲

  options = {
              cc:CcAddr,
              bcc:BccAddr,
              name:'予定自動送信Gmail',
              noReply: true,
            };
            
  //メール送信
  GmailApp.sendEmail(ToAddr, subject, body,options);
}</pre><p>&nbsp;</p>
<h3>全体解説</h3>
<p>流れとしては以下のようになっています。</p>
<p>①送信対象のイベントを取得</p>
<p>②取得したイベントを文章に成形する</p>
<p>③メールを送信する</p>
<h3>送信対象のイベントを取得(86行目～)</h3>
<p>86行目で、送信する日付に一致したイベントを取得しています。</p>
<p>本当は不要だったのですが、「作業シート」に対象のイベントを表示するようにしています。</p>
<p>Query関数でSQLのようにデータを取得しています。</p>
<p>そして、イベントを「sheetWorkData」変数に格納しています。</p>
<h3>取得したイベントを文章に成形する(113行目～)</h3>
<p>スプレッドシートの1行を「<strong>日付</strong> + 改行 + <strong>場所 </strong>+ 改行 + <strong>内容</strong>」に整形していきます。</p>
<p>ここは対象のイベント件数分ループして本文を作成しています。</p>
<p>124行目でフッターの文言をセットしています。</p>
<h3>メールを送信する(127行目～)</h3>
<p>オプションの中にCC、差出人の表示名、返信可否をセットしています。</p>
<p>そして、135行目で本文、件名をセットしてメール送信を行っています。</p>The post <a href="https://loosecarrot.com/2022/01/23/5431/">GoogleSpreadSheetから自動で予定をメールお知らせ</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2022/01/23/5431/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5431</post-id>	</item>
		<item>
		<title>GoogleSpreadSheetから自動でメール送信</title>
		<link>https://loosecarrot.com/2019/04/05/3353/</link>
					<comments>https://loosecarrot.com/2019/04/05/3353/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Fri, 05 Apr 2019 13:06:20 +0000</pubDate>
				<category><![CDATA[GAS(GoogleAppsScript)]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=3353</guid>

					<description><![CDATA[<p>GoogleSpreadSheetを使って指定時刻にメールを送信するプログラムを作ってみました。 GoogleSpreadSheetはExcelのように有料のライセンスが不要なので、使えると便利かなと思い、作ってみました</p>
The post <a href="https://loosecarrot.com/2019/04/05/3353/">GoogleSpreadSheetから自動でメール送信</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<a href="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3370" src="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email.png" alt="" width="662" height="277" /></a>
<p>GoogleSpreadSheetを使って指定時刻にメールを送信するプログラムを作ってみました。</p>
<p>GoogleSpreadSheetはExcelのように有料のライセンスが不要なので、使えると便利かなと思い、作ってみました。</p>
<a href="https://loosecarrot.com/2022/01/23/5431/" class="blog-card"><div class="blog-card-hl-box"><i class="jic jin-ifont-post"></i><span class="blog-card-hl"></span></div><div class="blog-card-box"><div class="blog-card-thumbnail"><img decoding="async" src="https://loosecarrot.com/wp-content/uploads/2022/01/GoogleSpreadSheetから予定を自動メールお知らせ_1-2-320x180.jpg" class="blog-card-thumb-image wp-post-image" alt="" width ="162" height ="91" /></div><div class="blog-card-content"><span class="blog-card-title">GoogleSpreadSheetから自動で予定をメールお知らせ</span><span class="blog-card-excerpt">

予定がいっぱいあると、忘れてしまいがちなので、事前に通知してくれるアプリが欲しいと思っていました。

なので、以前C#で予定...</span></div></div></a>
<h2>メール送信のGASスクリプト</h2>
<p>メール送信をするGASのスクリプトは以下です。</p><pre class="urvanov-syntax-highlighter-plain-tag">//=============================================='
//目的　　　 ：メール送信処理
//引数　　　 ：
//戻り値　　 ：
//=============================================='
function sendEmails()
{
　var sheet = SpreadsheetApp.getActiveSheet();　 // シートの取得
　var startRows = 2;　　　　　　　　　　　　　　 // 開始行数
　var sheetData = sheet.getSheetValues(startRows, 1, sheet.getLastRow(), sheet.getLastColumn());　// シートのデータを取得（2次元配列）
　var dtLimit = new Date();　　　　　　　　　　　// 現在時刻を取得
 
　// シートの各行ごとにデータを取り出す
　sheetData.forEach(function(value, index)
　　{
　　　　// 送信完了していない、かつ送信予定日時が現在時刻より前ならば、メールを送信する
　　　　if (!value[4] &amp;&amp; (new Date(value[3])).getTime() &lt; dtLimit.getTime()) 
　　　　{
　　　　　MailApp.sendEmail(value[0], value[1], value[2]);　// メールを送信する
　　　　　sheet.getRange(startRows + index, 4 + 1).setValue(dtLimit);　// 送信完了日時をシートに書く
　　　　}
　　});
}</pre><p>&nbsp;</p>
<p><span style="font-size: 1em; letter-spacing: 0.05em;">送信元の情報は以下が例です。</span></p>
<a href="https://loosecarrot.com/wp-content/uploads/2019/04/GAS_Aoutmatic_Email_Send-1.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3362" src="https://loosecarrot.com/wp-content/uploads/2019/04/GAS_Aoutmatic_Email_Send-1.png" alt="" width="688" height="430" /></a>
<a href="https://loosecarrot.com/2018/12/02/1576/" class="blog-card"><div class="blog-card-hl-box"><i class="jic jin-ifont-post"></i><span class="blog-card-hl"></span></div><div class="blog-card-box"><div class="blog-card-thumbnail"><img decoding="async" src="https://loosecarrot.com/wp-content/uploads/2018/12/email-excel-vba-320x180.jpg" class="blog-card-thumb-image wp-post-image" alt="" width ="162" height ="91" /></div><div class="blog-card-content"><span class="blog-card-title">Excel VBA メール送信ツール(フリーメール)</span><span class="blog-card-excerpt">VBAでメール送信について紹介します。

自動でメール送信するツールを作ってみました。

今回はOutlookではなくフリーメー...</span></div></div></a>
<h2>指定した時刻にGASを実行する設定</h2>
<p>指定した時間にメールを送る設定を行う必要があります。</p>
<p>以下のスクリプトを実行します。</p>
<p>以下は19:45分にsendEmailsを呼び出してメール送信させる設定です。</p>
<h3>スクリプト</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">//=============================================='
//目的　　　 ：指定時刻に"sendEmails"を実行する
//引数　　　 ：
//戻り値　　 ：
//=============================================='
function setTrigger()
{
  var setTime = new Date();
  setTime.setHours(19);                         //〇〇時の設定
  setTime.setMinutes(45);                       //××分の設定 
  ScriptApp.newTrigger('sendEmails').timeBased().at(setTime).create();
}</pre><p></p>
<h3>実行方法</h3>
<p>まずはスプレッドシート画面から以下の順でスクリプトエディタを開きます。</p>
<p>「ツール」　→　「&lt;&gt; スクリプトエディタ」</p>
<a href="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_2.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3379" src="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_2.png" alt="" width="480" height="503" /></a>
<p>スクリプトエディタから以下の順でスクリプトを実行します。</p>
<p>「実行」→「関数を実行」→「setTrigger」</p>
<a href="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3380" src="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3.png" alt="" width="945" height="471" srcset="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3.png 945w, https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3-300x150.png 300w, https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3-768x383.png 768w, https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_3.png 856w" sizes="(max-width: 945px) 100vw, 945px" /></a>
<p><span style="color: #ff0000;">※初回実行時はグーグアカウントに実行許可してよいか確認が来ます。</span></p>
<p><span style="color: #ff0000;">必ず許可設定しておきましょう。</span></p>
<h3>送信メールサンプル</h3>
<p>送信したメールのサンプルです。</p>
<p>エクセルに記載した通りに送られます。</p>
<a href="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_4.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3382" src="https://loosecarrot.com/wp-content/uploads/2019/04/GoogleSpreadSheet_Email_4.png" alt="" width="626" height="279" /></a>
<p>&nbsp;</p>The post <a href="https://loosecarrot.com/2019/04/05/3353/">GoogleSpreadSheetから自動でメール送信</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2019/04/05/3353/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3353</post-id>	</item>
	</channel>
</rss>
