<?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/"
	>

<channel>
	<title>LINE | imakat.com</title>
	<atom:link href="https://imakat.com/tag/line/feed/" rel="self" type="application/rss+xml" />
	<link>https://imakat.com</link>
	<description>工夫と改善で人生をちょっと豊かに</description>
	<lastBuildDate>Sat, 13 Sep 2025 06:02:54 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://i0.wp.com/imakat.com/wp-content/uploads/2023/07/cropped-80d64ecd340db4e2ca3224859b04caed.png?fit=32%2C32&#038;ssl=1</url>
	<title>LINE | imakat.com</title>
	<link>https://imakat.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">160909258</site>	<item>
		<title>【iPad iPhone】線画イラストを切り抜く方法　その１</title>
		<link>https://imakat.com/2025/05/11/26230/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Sat, 10 May 2025 21:39:00 +0000</pubDate>
				<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[フリーボード]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=26230</guid>

					<description><![CDATA[今回は、軽い話題を紹介します。動画をご覧ください。 iPad iPhone 最近、AIの画像が増えました。面白いです。しかし、すぐ飽きそうな気がします。みんなが持っているものを自分も持っているのが、心地よい場合もあります [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">今回は、軽い話題を紹介します。動画をご覧ください。</p>



<h5 class="wp-block-heading">iPad</h5>


<div class="sc-dynamic-embed">
  <style>
  /* リンクの見た目を整える */
  .sc-dynamic-embed .sc-link-container { 
      display: flex; 
      gap: 12px; 
      margin-bottom: 10px; 
      flex-wrap: wrap; 
      align-items: center; 
  }
  .sc-dynamic-embed .sc-link { margin-bottom: 0; }
  .sc-dynamic-embed .sc-link a {
    font-size: 15px;
    font-weight: normal;
    text-decoration: underline;
    color: #0073aa;
  }
  .sc-dynamic-embed .sc-link a:hover { text-decoration: none; color: #000; }
  
  /* ★変更：ダウンロードボタンの基本サイズを小さくし、文字の折り返しを防止 */
  .sc-dynamic-embed .dl-btn a {
    font-size: 12px !important;
    color: #d9534f;
    font-weight: bold;
    text-decoration: none;
    background: #fdf0ef;
    padding: 4px 6px;
    border-radius: 4px;
    border: 1px solid #d9534f;
    white-space: nowrap; 
  }
  .sc-dynamic-embed .dl-btn a:hover { background: #d9534f; color: #fff; }

  /* ★追加：スマホ画面（幅500px以下）の時は、さらに全体を縮小して1行に収める */
  @media (max-width: 500px) {
    .sc-dynamic-embed .sc-link-container { gap: 6px; }
    .sc-dynamic-embed .sc-link a { font-size: 13px; }
    .sc-dynamic-embed .dl-btn a { font-size: 11px !important; padding: 3px 5px; }
  }

  /* 行梱包時の基本スタイル */
  .sc-dynamic-embed .imk-line {
      display: inline-block;
      width: 100%;
      border-radius: 2px;
      transition: background-color 0.1s;
  }

  /* 古い枠内字幕ボックスを強制消去 */
  .sc-dynamic-embed #subtitleOverlay,
  .sc-dynamic-embed #scSubtitleOverlay,
  .sc-dynamic-embed .overlay-cue,
  .sc-dynamic-embed .band {
      display: none !important;
      opacity: 0 !important;
      visibility: hidden !important;
      pointer-events: none !important;
  }
  </style>

  <div class="sc-link-container">
    <p class="sc-link">
      <a href="https://imakat.com/ds62/?drid=47" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
    <p class="sc-link dl-btn">
      <a href="#" id="imk-dynamic-dl-btn" target="_blank" rel="noopener" download style="display: none;">
        📥 動画をダウンロード
      </a>
    </p>
  </div>

  <style>
            :root{ --dr5emd-max: 1920px; }
            #subtitleOverlay, #scSubtitleOverlay, .overlay-cue, .band { display: none !important; opacity: 0 !important; }
            .imk-line { display: inline-block; width: 100%; border-radius: 2px; transition: background-color 0.1s; }
            .dr5emd-sublist details > p{ height:200px; overflow:auto; background-color:#EDF7FF; padding:2px 6px; margin:0; box-shadow:3px 3px 4px black; position: relative; }
            .dr5emd-sublist details > summary{ padding:2px 6px; width:100%; background-color:#ddd; border:none; box-shadow:3px 3px 4px black; cursor:pointer; list-style:none; }
            
                .video-wrap{position:relative;width:100%;margin:0 auto}
                #myVideo{width:100%;height:auto;min-height:200px;display:block;background:#000;}</style><div class="dr5emd-container"><div class="video-wrap"><video id="myVideo" controls poster="https://imakat.com/rd.php?id=cs46xavx.png" playsinline preload="metadata" style="width:100%;height:auto;">  <source src="https://imakat.com/rd.php?id=hIA7Hj8k.mp4" type="video/mp4">  <track src="https://imakat.com/rd.php?id=9CiBaHAS.vtt" label="日本語" srclang="ja" kind="subtitles" default></video></div><div class="dr5emd-sublist"><details><summary>字幕一覧(クリック)</summary> <p>
(<a href="#" class="imk-cue" data-seek="0:00">00:00:00</a>) 1) 〜キャラクタを白地で切り抜く方法〜<br>
(<a href="#" class="imk-cue" data-seek="0:26">00:00:26</a>) 2) iPadの「フリーボード」を使います。<br>
(<a href="#" class="imk-cue" data-seek="0:31">00:00:31</a>) 3) これが手書きの、元の描画です。このあとシャッター音が出ます。<br>
(<a href="#" class="imk-cue" data-seek="0:37">00:00:37</a>) 4) スクショを撮りました。<br>
(<a href="#" class="imk-cue" data-seek="0:42">00:00:42</a>) 5) スクショの表示をクリックで開きます。<br>
(<a href="#" class="imk-cue" data-seek="0:46">00:00:46</a>) 6) 切り抜きたいキャラの周りを囲みます。<br>
(<a href="#" class="imk-cue" data-seek="0:58">00:00:58</a>) 7) 「クイックメモに保存」を選びます。<br>
(<a href="#" class="imk-cue" data-seek="1:10">00:01:10</a>) 8) 右下の帯をクリックして、クイックメモを表示します。<br>
(<a href="#" class="imk-cue" data-seek="1:20">00:01:20</a>) 9) 切り抜きたいキャラの上をタッチします。<br>
(<a href="#" class="imk-cue" data-seek="1:24">00:01:24</a>) 10) すると、白い光が外周を照らします。<br>
(<a href="#" class="imk-cue" data-seek="1:28">00:01:28</a>) 11) 「コピー」を選びます。<br>
(<a href="#" class="imk-cue" data-seek="1:35">00:01:35</a>) 12) 例えば、フリーボードにペーストします。<br>
(<a href="#" class="imk-cue" data-seek="1:51">00:01:51</a>) 13) 拡張子はheicになっています。表示した画像のペーストはGoogle図形描画にも可能です。<br>
(<a href="#" class="imk-cue" data-seek="1:57">00:01:57</a>) 14) iPhoneの場合、「画像に保存」→LINEから読み込めます。<br>
(<a href="#" class="imk-cue" data-seek="2:03">00:02:03</a>) 15) 以上です。<br>
</p> </details>
</div></div>            <script>
            document.addEventListener("DOMContentLoaded", function(){
                var video = document.getElementById("myVideo");
                if(!video) return;

                            });
            </script>
            

  <script>
  (function(){
    var me = document.currentScript;
    var wrapper = me ? me.closest('.sc-dynamic-embed') : null;

    /* -----------------------------------------------
       1. ダウンロードボタンの自動セットアップ機能
       ----------------------------------------------- */
    function setupDownloadButton() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video');
      var dlBtn = target.querySelector('#imk-dynamic-dl-btn');

      if (video && dlBtn && dlBtn.style.display === 'none') {
        var src = video.currentSrc || video.src;
        if (!src) {
          var source = video.querySelector('source');
          if (source) src = source.src;
        }
        if (src) {
          dlBtn.href = src;
          dlBtn.style.display = 'inline-block';
        }
      }
    }

    /* -----------------------------------------------
       2. 字幕制御＆ハイライト機能（iPhone全画面 完全対応版）
       ----------------------------------------------- */
    function initSubtitles() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video');
      var listContainer = target.querySelector('details > p');
      
      if (!video || !listContainer) return false; 

      if (video.dataset.subInit === 'true') return true; 
      video.dataset.subInit = 'true';

      var oldOverlay = target.querySelector('#subtitleOverlay') || target.querySelector('#scSubtitleOverlay');
      if (oldOverlay) {
          oldOverlay.style.setProperty('display', 'none', 'important');
          oldOverlay.innerHTML = ''; 
      }

      function isSpecialMode() {
        var isFs = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
        var isPiP = !!(document.pictureInPictureElement && document.pictureInPictureElement === video) || (video.webkitPresentationMode === "picture-in-picture");
        var isIOSFs = !!video.webkitDisplayingFullscreen; 
        return isFs || isPiP || isIOSFs;
      }

      try {
        if(video.textTracks && video.textTracks.length > 0){
          for(var i=0; i<video.textTracks.length; i++){
             if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions'){
                 video.textTracks[i].mode = "hidden";
             }
          }
        }
      } catch(e){}

      video.addEventListener("webkitbeginfullscreen", function() {
          try {
              if(video.textTracks && video.textTracks.length > 0) {
                  for(var i=0; i<video.textTracks.length; i++){
                      if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') video.textTracks[i].mode = "showing";
                  }
              }
          } catch(e){}
      });
      video.addEventListener("webkitendfullscreen", function() {
          try {
              if(video.textTracks && video.textTracks.length > 0) {
                  for(var i=0; i<video.textTracks.length; i++){
                      if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') video.textTracks[i].mode = "hidden";
                  }
              }
          } catch(e){}
      });

      var detailsEl = target.querySelector("details");
      if (detailsEl) {
          detailsEl.open = true; 
          var summaryEl = detailsEl.querySelector("summary");
          if (summaryEl) summaryEl.textContent = "字幕(シーン)はここをクリック";
      }

      if (!listContainer.dataset.formatted) {
          var html = listContainer.innerHTML;
          var lines = html.split(/<br\s*\/?>/i);
          var newHtml = "";
          for(var j=0; j<lines.length; j++) {
              if(lines[j].trim() === "") continue;
              newHtml += "<span class='imk-line'>" + lines[j] + "</span><br>";
          }
          listContainer.innerHTML = newHtml;
          listContainer.dataset.formatted = "true";
      }

      function parseTs(ts){
        if(!ts) return null;
        var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
        if(p.length===2) return p[0]*60 + p[1];
        if(p.length===3) return p[0]*3600 + p[1]*60 + p[2];
        return null;
      }

      var rootSublist = target.querySelector(".dr5-sublist") || listContainer.parentElement;
      if (rootSublist) {
        rootSublist.addEventListener("click", function(e){
          var a = e.target.closest && e.target.closest("a.imk-cue[data-seek]");
          if(!a) return;
          e.preventDefault();
          var sec = parseTs(a.getAttribute("data-seek"));
          if(sec==null) return;
          try{ video.currentTime = sec; if(video.paused) video.play(); }catch(_){}
        });
      }

      video.addEventListener("timeupdate", function(){
        var desiredMode = isSpecialMode() ? "showing" : "hidden";
        try {
            if(video.textTracks && video.textTracks.length > 0){
                for(var i=0; i<video.textTracks.length; i++){
                    if((video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') && video.textTracks[i].mode !== desiredMode) {
                        video.textTracks[i].mode = desiredMode;
                    }
                }
            }
        } catch(e){}

        var cues = listContainer.querySelectorAll("a.imk-cue");
        if(cues.length === 0) return;
        var cur = video.currentTime;
        var activeA = null;

        for(var i=0; i<cues.length; i++){
            var t = parseTs(cues[i].getAttribute("data-seek"));
            if(t !== null && cur >= t - 0.5){ activeA = cues[i]; } 
            else if(t > cur){ break; }
        }

        if(activeA){
            var activeLine = activeA.closest(".imk-line");
            if(!activeLine) activeLine = activeA;

            if(activeLine.classList.contains("active-hl")) return;

            var allLines = listContainer.querySelectorAll(".imk-line");
            for(var k=0; k<allLines.length; k++) {
                allLines[k].classList.remove("active-hl");
                allLines[k].removeAttribute("style"); 
            }
            var allLinks = listContainer.querySelectorAll("a");
            for(var m=0; m<allLinks.length; m++) {
                allLinks[m].classList.remove("active-hl");
                allLinks[m].removeAttribute("style"); 
            }

            activeLine.classList.add("active-hl");
            activeLine.style.setProperty("background-color", "#ffff00", "important");
            activeLine.style.setProperty("color", "red", "important");
            activeLine.style.setProperty("font-weight", "normal", "important");
            
            var newLinks = activeLine.querySelectorAll("a");
            for(var n=0; n<newLinks.length; n++) {
                newLinks[n].style.setProperty("color", "red", "important");
                newLinks[n].style.setProperty("text-decoration", "none", "important");
            }

            if(listContainer.offsetParent !== null){
                var containerRect = listContainer.getBoundingClientRect();
                var activeRect = activeLine.getBoundingClientRect();
                var targetScroll = listContainer.scrollTop + (activeRect.top - containerRect.top) - (listContainer.clientHeight / 2) + (activeLine.clientHeight / 2);
                listContainer.scrollTo({ top: targetScroll, behavior: "smooth" });
            }
        }
      });

      return true;
    }

    /* -----------------------------------------------
       監視タイマー（URL抜き出し＆ボタン表示を継続的に実行）
       ----------------------------------------------- */
    var checks = 0;
    var checkTimer = setInterval(function(){
      setupDownloadButton();
      var success = initSubtitles();
      checks++;
      if (success || checks > 20) { 
        clearInterval(checkTimer);
      }
    }, 500); 

    /* -----------------------------------------------
       3. 画面遷移時の停止機能
       ----------------------------------------------- */
    if (!window.scStopAndGo) {
      window.scStopAndGo = function(event, link){
        try{
          var mediaEls = document.querySelectorAll('video, audio');
          mediaEls.forEach(function(m){
            try{
              if (!m.paused) m.pause();
              if (document.pictureInPictureElement === m && document.exitPictureInPicture) {
                document.exitPictureInPicture().catch(function(){});
              }
            }catch(e){}
          });
        }finally{
          event.preventDefault();
          setTimeout(function(){
            if (link.target === '_blank') {
              window.open(link.href, '_blank');
            } else {
              window.location.href = link.href;
            }
          }, 50);
        }
        return false;
      };
    }
  })();
  </script>
</div>



<h5 class="wp-block-heading">iPhone</h5>


<div class="sc-dynamic-embed">
  <style>
  /* リンクの見た目を整える */
  .sc-dynamic-embed .sc-link-container { 
      display: flex; 
      gap: 12px; 
      margin-bottom: 10px; 
      flex-wrap: wrap; 
      align-items: center; 
  }
  .sc-dynamic-embed .sc-link { margin-bottom: 0; }
  .sc-dynamic-embed .sc-link a {
    font-size: 15px;
    font-weight: normal;
    text-decoration: underline;
    color: #0073aa;
  }
  .sc-dynamic-embed .sc-link a:hover { text-decoration: none; color: #000; }
  
  /* ★変更：ダウンロードボタンの基本サイズを小さくし、文字の折り返しを防止 */
  .sc-dynamic-embed .dl-btn a {
    font-size: 12px !important;
    color: #d9534f;
    font-weight: bold;
    text-decoration: none;
    background: #fdf0ef;
    padding: 4px 6px;
    border-radius: 4px;
    border: 1px solid #d9534f;
    white-space: nowrap; 
  }
  .sc-dynamic-embed .dl-btn a:hover { background: #d9534f; color: #fff; }

  /* ★追加：スマホ画面（幅500px以下）の時は、さらに全体を縮小して1行に収める */
  @media (max-width: 500px) {
    .sc-dynamic-embed .sc-link-container { gap: 6px; }
    .sc-dynamic-embed .sc-link a { font-size: 13px; }
    .sc-dynamic-embed .dl-btn a { font-size: 11px !important; padding: 3px 5px; }
  }

  /* 行梱包時の基本スタイル */
  .sc-dynamic-embed .imk-line {
      display: inline-block;
      width: 100%;
      border-radius: 2px;
      transition: background-color 0.1s;
  }

  /* 古い枠内字幕ボックスを強制消去 */
  .sc-dynamic-embed #subtitleOverlay,
  .sc-dynamic-embed #scSubtitleOverlay,
  .sc-dynamic-embed .overlay-cue,
  .sc-dynamic-embed .band {
      display: none !important;
      opacity: 0 !important;
      visibility: hidden !important;
      pointer-events: none !important;
  }
  </style>

  <div class="sc-link-container">
    <p class="sc-link">
      <a href="https://imakat.com/ds62/?drid=48" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
    <p class="sc-link dl-btn">
      <a href="#" id="imk-dynamic-dl-btn" target="_blank" rel="noopener" download style="display: none;">
        📥 動画をダウンロード
      </a>
    </p>
  </div>

  <style>
            :root{ --dr5emd-max: 1920px; }
            #subtitleOverlay, #scSubtitleOverlay, .overlay-cue, .band { display: none !important; opacity: 0 !important; }
            .imk-line { display: inline-block; width: 100%; border-radius: 2px; transition: background-color 0.1s; }
            .dr5emd-sublist details > p{ height:200px; overflow:auto; background-color:#EDF7FF; padding:2px 6px; margin:0; box-shadow:3px 3px 4px black; position: relative; }
            .dr5emd-sublist details > summary{ padding:2px 6px; width:100%; background-color:#ddd; border:none; box-shadow:3px 3px 4px black; cursor:pointer; list-style:none; }
            
                .video-wrap{position:relative;width:100%;margin:0 auto}
                #myVideo{width:100%;height:auto;min-height:200px;display:block;background:#000;}</style><div class="dr5emd-container"><div class="video-wrap"><video id="myVideo" controls poster="https://imakat.com/rd.php?id=YsQh9coX.png" playsinline preload="metadata" style="width:100%;height:auto;">  <source src="https://imakat.com/rd.php?id=x3171bWz.mp4" type="video/mp4"></video></div></div>            <script>
            document.addEventListener("DOMContentLoaded", function(){
                var video = document.getElementById("myVideo");
                if(!video) return;

                            });
            </script>
            

  <script>
  (function(){
    var me = document.currentScript;
    var wrapper = me ? me.closest('.sc-dynamic-embed') : null;

    /* -----------------------------------------------
       1. ダウンロードボタンの自動セットアップ機能
       ----------------------------------------------- */
    function setupDownloadButton() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video');
      var dlBtn = target.querySelector('#imk-dynamic-dl-btn');

      if (video && dlBtn && dlBtn.style.display === 'none') {
        var src = video.currentSrc || video.src;
        if (!src) {
          var source = video.querySelector('source');
          if (source) src = source.src;
        }
        if (src) {
          dlBtn.href = src;
          dlBtn.style.display = 'inline-block';
        }
      }
    }

    /* -----------------------------------------------
       2. 字幕制御＆ハイライト機能（iPhone全画面 完全対応版）
       ----------------------------------------------- */
    function initSubtitles() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video');
      var listContainer = target.querySelector('details > p');
      
      if (!video || !listContainer) return false; 

      if (video.dataset.subInit === 'true') return true; 
      video.dataset.subInit = 'true';

      var oldOverlay = target.querySelector('#subtitleOverlay') || target.querySelector('#scSubtitleOverlay');
      if (oldOverlay) {
          oldOverlay.style.setProperty('display', 'none', 'important');
          oldOverlay.innerHTML = ''; 
      }

      function isSpecialMode() {
        var isFs = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
        var isPiP = !!(document.pictureInPictureElement && document.pictureInPictureElement === video) || (video.webkitPresentationMode === "picture-in-picture");
        var isIOSFs = !!video.webkitDisplayingFullscreen; 
        return isFs || isPiP || isIOSFs;
      }

      try {
        if(video.textTracks && video.textTracks.length > 0){
          for(var i=0; i<video.textTracks.length; i++){
             if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions'){
                 video.textTracks[i].mode = "hidden";
             }
          }
        }
      } catch(e){}

      video.addEventListener("webkitbeginfullscreen", function() {
          try {
              if(video.textTracks && video.textTracks.length > 0) {
                  for(var i=0; i<video.textTracks.length; i++){
                      if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') video.textTracks[i].mode = "showing";
                  }
              }
          } catch(e){}
      });
      video.addEventListener("webkitendfullscreen", function() {
          try {
              if(video.textTracks && video.textTracks.length > 0) {
                  for(var i=0; i<video.textTracks.length; i++){
                      if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') video.textTracks[i].mode = "hidden";
                  }
              }
          } catch(e){}
      });

      var detailsEl = target.querySelector("details");
      if (detailsEl) {
          detailsEl.open = true; 
          var summaryEl = detailsEl.querySelector("summary");
          if (summaryEl) summaryEl.textContent = "字幕(シーン)はここをクリック";
      }

      if (!listContainer.dataset.formatted) {
          var html = listContainer.innerHTML;
          var lines = html.split(/<br\s*\/?>/i);
          var newHtml = "";
          for(var j=0; j<lines.length; j++) {
              if(lines[j].trim() === "") continue;
              newHtml += "<span class='imk-line'>" + lines[j] + "</span><br>";
          }
          listContainer.innerHTML = newHtml;
          listContainer.dataset.formatted = "true";
      }

      function parseTs(ts){
        if(!ts) return null;
        var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
        if(p.length===2) return p[0]*60 + p[1];
        if(p.length===3) return p[0]*3600 + p[1]*60 + p[2];
        return null;
      }

      var rootSublist = target.querySelector(".dr5-sublist") || listContainer.parentElement;
      if (rootSublist) {
        rootSublist.addEventListener("click", function(e){
          var a = e.target.closest && e.target.closest("a.imk-cue[data-seek]");
          if(!a) return;
          e.preventDefault();
          var sec = parseTs(a.getAttribute("data-seek"));
          if(sec==null) return;
          try{ video.currentTime = sec; if(video.paused) video.play(); }catch(_){}
        });
      }

      video.addEventListener("timeupdate", function(){
        var desiredMode = isSpecialMode() ? "showing" : "hidden";
        try {
            if(video.textTracks && video.textTracks.length > 0){
                for(var i=0; i<video.textTracks.length; i++){
                    if((video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') && video.textTracks[i].mode !== desiredMode) {
                        video.textTracks[i].mode = desiredMode;
                    }
                }
            }
        } catch(e){}

        var cues = listContainer.querySelectorAll("a.imk-cue");
        if(cues.length === 0) return;
        var cur = video.currentTime;
        var activeA = null;

        for(var i=0; i<cues.length; i++){
            var t = parseTs(cues[i].getAttribute("data-seek"));
            if(t !== null && cur >= t - 0.5){ activeA = cues[i]; } 
            else if(t > cur){ break; }
        }

        if(activeA){
            var activeLine = activeA.closest(".imk-line");
            if(!activeLine) activeLine = activeA;

            if(activeLine.classList.contains("active-hl")) return;

            var allLines = listContainer.querySelectorAll(".imk-line");
            for(var k=0; k<allLines.length; k++) {
                allLines[k].classList.remove("active-hl");
                allLines[k].removeAttribute("style"); 
            }
            var allLinks = listContainer.querySelectorAll("a");
            for(var m=0; m<allLinks.length; m++) {
                allLinks[m].classList.remove("active-hl");
                allLinks[m].removeAttribute("style"); 
            }

            activeLine.classList.add("active-hl");
            activeLine.style.setProperty("background-color", "#ffff00", "important");
            activeLine.style.setProperty("color", "red", "important");
            activeLine.style.setProperty("font-weight", "normal", "important");
            
            var newLinks = activeLine.querySelectorAll("a");
            for(var n=0; n<newLinks.length; n++) {
                newLinks[n].style.setProperty("color", "red", "important");
                newLinks[n].style.setProperty("text-decoration", "none", "important");
            }

            if(listContainer.offsetParent !== null){
                var containerRect = listContainer.getBoundingClientRect();
                var activeRect = activeLine.getBoundingClientRect();
                var targetScroll = listContainer.scrollTop + (activeRect.top - containerRect.top) - (listContainer.clientHeight / 2) + (activeLine.clientHeight / 2);
                listContainer.scrollTo({ top: targetScroll, behavior: "smooth" });
            }
        }
      });

      return true;
    }

    /* -----------------------------------------------
       監視タイマー（URL抜き出し＆ボタン表示を継続的に実行）
       ----------------------------------------------- */
    var checks = 0;
    var checkTimer = setInterval(function(){
      setupDownloadButton();
      var success = initSubtitles();
      checks++;
      if (success || checks > 20) { 
        clearInterval(checkTimer);
      }
    }, 500); 

    /* -----------------------------------------------
       3. 画面遷移時の停止機能
       ----------------------------------------------- */
    if (!window.scStopAndGo) {
      window.scStopAndGo = function(event, link){
        try{
          var mediaEls = document.querySelectorAll('video, audio');
          mediaEls.forEach(function(m){
            try{
              if (!m.paused) m.pause();
              if (document.pictureInPictureElement === m && document.exitPictureInPicture) {
                document.exitPictureInPicture().catch(function(){});
              }
            }catch(e){}
          });
        }finally{
          event.preventDefault();
          setTimeout(function(){
            if (link.target === '_blank') {
              window.open(link.href, '_blank');
            } else {
              window.location.href = link.href;
            }
          }, 50);
        }
        return false;
      };
    }
  })();
  </script>
</div>



<p class="wp-block-paragraph">最近、AIの画像が増えました。面白いです。しかし、すぐ飽きそうな気がします。みんなが持っているものを自分も持っているのが、心地よい場合もあります。それは、お祭りの法被と同じです。</p>



<p class="wp-block-paragraph">さて、イラストや漫画は、どのように描くでしょうか。私は、線から描きます。というか、モノクロです。<br>色を着けるのは非常に苦手です。というのも、赤緑色弱なので、色んな色が混じると識別が怪しくなっていきます。ですので、私にとっては、描画は、色無しで完成です。</p>



<p class="wp-block-paragraph">ヘタですが、手描きが落ち着きますね。</p>



<p class="wp-block-paragraph">欲しいのは、左側の線だけの描画と、右側の外周内が白の描画の２つだけです。</p>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=k63m2cER.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=k63m2cER.png" alt=""/></a></figure>



<p class="wp-block-paragraph">以前は、右の白の描画を作るのに、あれこれ市販のアプリを使っていましたが、iPadOS、iOSの16以降でしょうか、AppleのOSだけで可能になっています。</p>



<h5 class="wp-block-heading">iPhoneで、イラストをLINEへ挿入する方法（スタンプや絵文字としてではなく）</h5>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=xSm1526Z.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=xSm1526Z.png" alt="" style="width:111px;height:auto"/></a></figure>



<p class="wp-block-paragraph">iPhoneで、こうしたイラストをLINEに挿入する方法ですが、意外に難航します。</p>



<p class="wp-block-paragraph">このイラストは、LINEが求めるスタンプや絵文字としては、登録したくないですよね。というのは、そのようにすると手続きが結構面倒だからです。</p>



<p class="wp-block-paragraph">さてまずイラストを描くところからですが、iPhoneの「フリーボード」でイラストを描くのは、指で描くのはなかなか困難です。タッチペンを使うのですが、Apple純正のApple Pencilは、iPhoneでは反応しません。市販されている安価のタッチペンを使います。例えば、以下の「<strong>いろいろかける君</strong>」のようなペンです。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=7fwcPZbT.jpg" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=7fwcPZbT.jpg" alt="" style="width:382px;height:auto"/></a></figure>



<p class="wp-block-paragraph">上の動画のように、イラストを描いてからheicファイルをフリーボードにペーストするまではiPadと同じで、<strong><span class="marker">その後、直接、ドラッグ&amp;ドロップで画像を、LINEへ貼り付けると、透過が崩れて全体が白地になってしまいます。やむをえず、「画像を保存」してからそれを読み込む形になります</span>。</strong>一手間余分にかかってしまいます。<br>もっと簡単にしたいところですが、今のところ、これ以外の方法が見当たりません。</p>



<p class="wp-block-paragraph">以上です。</p>



<p class="wp-block-paragraph"><br></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">26230</post-id>	</item>
		<item>
		<title>【小団体のIT】スマホから5つのSNSへ、アプリを開かないで送信する方法~AppSheet~</title>
		<link>https://imakat.com/2022/05/06/14993/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Fri, 06 May 2022 07:35:14 +0000</pubDate>
				<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[Googleスプレッドシート]]></category>
		<category><![CDATA[中途半端な規模]]></category>
		<category><![CDATA[GAS]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Push7]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[SNS]]></category>
		<category><![CDATA[ワンタッチ]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Gメール]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=14993</guid>

					<description><![CDATA[2023.7.31：TwitterがXに移行。APIへの影響が不明。2023.2.16追記：TwitterAPIの有料化の発表がありましたが、投稿bot1500個までは無料化へ自動移行とのことで、多くの場合、問題なさそう [&#8230;]]]></description>
										<content:encoded><![CDATA[
<hr class="wp-block-separator has-text-color has-key-color-color has-css-opacity has-key-color-background-color has-background is-style-wide"/>



<p class="wp-block-paragraph">2023.7.31：TwitterがXに移行。APIへの影響が不明。<br>2023.2.16追記：TwitterAPIの有料化の発表がありましたが、投稿bot1500個までは無料化へ自動移行とのことで、多くの場合、問題なさそうです。<br>2022.5.13更新：Twitterを追加。無料使用に留める場合は、API v2を利用すること。</p>



<hr class="wp-block-separator has-text-color has-key-color-color has-css-opacity has-key-color-background-color has-background is-style-wide"/>



<p class="wp-block-paragraph">＜分散通知をスマホから実行する＞<br><span class="fz-12px"><a href="https://imakat.com/page-220506/" target="_blank">別ページで表示</a></span></p>



<img decoding="async" src="https://docs.google.com/drawings/d/e/2PACX-1vR8WAJSVQk0EV-LtoZdCv8V5n9CnwkUHGAVB1RmMiV05BKu9OWCDJoi8WOuEPfcwWKfEanrFwYxRqft/pub?w=1440&amp;h=1080">



<hr class="wp-block-separator has-text-color has-key-color-color has-css-opacity has-key-color-background-color has-background is-style-wide"/>



<p class="wp-block-paragraph">メールとブログを含めるとSNSよりソシアルメディア(Social Media)という方が正しいのでしょうが、単語として分かりにくいので、ここでは「情報を配信するツール」としてSNSと呼ばせてもらいます。</p>



<p class="wp-block-paragraph">さて、昨年5回に亘って、「分散通知の仕組みを作る」として、電子メール、LINE、Push7、Bloggerのそれぞれへ、<strong><span class="marker">アプリを開かないで送信する仕組み</span></strong>、を説明しました。</p>



<p class="wp-block-paragraph">しかし、スマホで操作すると、GoogleスプシをChromeのPCサイトから扱う、という方法は非常に扱いづらいことは分かっていました。</p>



<p class="wp-block-paragraph">今回、それを、かなり<strong><span class="marker">実用的に改善しました</span></strong>ので紹介します。</p>



<p class="wp-block-paragraph">実は、AppSheetとGASの連携については、Google内で開発が進んでいますので、半年先には、もっと簡単に色々できるようになっているかもしれません。</p>



<p class="wp-block-paragraph">しかし今回私が改善したいこと自体が、さほど、高度な技術を要求することでもありませんので、現状の技量でアプローチしてみます。</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">ポイント解説</h3>



<h4 class="wp-block-heading">＜1＞ 人の手作業は、文を作成修正する→送りたいSNSを選び送信する、ただそれだけ。</h4>



<p class="wp-block-paragraph">前回の通知方式では、SNSアプリ別にGoogleSSとGASを組み合わせて、GoogleSSを立ち上げて内容を確認して、送信ボタンを押す、これをSNSアプリ毎に行う方式でしたが、今回は、GoogleSSは一つのファイルにして、その中へ、GASを各アプリ別に組み込む、という方法にしました。</p>



<p class="wp-block-paragraph">その各アプリ別のGASは、前回の通知方式で作ったものを、ほぼそのまま流用しています。<br>作業手順は以下のようになります。</p>



<p class="wp-block-paragraph">＜作業手順＞<br><span class="fz-12px"><a href="https://imakat.com/page-220507/" target="_blank">別ページで表示</a></span></p>



<img decoding="async" src="https://docs.google.com/drawings/d/e/2PACX-1vQWnxlTE0kL7hQM7qSqi0qRi0U5C5GMRkO8XM-D5EdpkDVyPPPfuzfDKy5GulyJMi1QOOylwOqPxkoT/pub?w=1440&amp;h=1080">



<p class="wp-block-paragraph">前回は、各GoogleSSを立ち上げて、投稿ボタンを押す、これを繰り返すという手間がありました。それがAppSheetの以下の２つのメニューで完結するようにしました。なお、AppSheetについては、<a href="https://imakat.com/2022/02/27/14686/" target="_blank">こちらの投稿</a>の中で、概略触れています。解説している日本語の書物は殆ど見かけませんが、唯一<a rel="noopener" target="_blank" href="https://www.amazon.co.jp/Google-AppSheet-ではじめる-ノーコード開発入門-掌田津耶乃/dp/4899775199/ref=asc_df_4899775199/?tag=jpgo-22&amp;linkCode=df0&amp;hvadid=524423533651&amp;hvpos=&amp;hvnetw=g&amp;hvrand=18135569281701901134&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1009446&amp;hvtargid=pla-1290663459033&amp;psc=1&amp;th=1&amp;psc=1">これ<span class="fa fa-external-link external-icon anchor-icon"></span></a>くらいです。使っているうちにだんだん慣れてくるとは思います。</p>



<p class="wp-block-paragraph">AppSheetアプリの実際の動きは、以下の動画をご覧ください。</p>



<div style="position:relative;">
<iframe src="https://player.vimeo.com/video/707215784?&#10;title=0&amp;&#10;byline=0&amp;&#10;muted=0&amp;&#10;portrait=0&amp;&#10;autopause=0" style="position:absolute;top:0;
left:0;
width:100%;
height:100%;
" frameborder="0" allow="autoplay;
fullscreen" allowfullscreen="">
</iframe>
</div>
<script src="https://player.vimeo.com/api/player.js">
</script>
<p>このビデオは無音です。Twitterは組み込む前です。</p>



<p class="wp-block-paragraph">以上のような動きになりますが、その中で、通知の作成及び修正の画面が以下です。追加または修正した行が、通知の送信の対象となります。ですから、今現在適当なテスト内容になっていますが、例えば、「避難情報通知用」などテンプレートとして用意しておくのもいい方法です。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=8rJroonM.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=8rJroonM.png" alt="" style="width:407px;height:705px"/></a></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=GAW83tyP.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=GAW83tyP.png" alt="" style="width:406px;height:697px"/></a></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=lCFUGKdp.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=lCFUGKdp.png" alt="" style="width:407px;height:700px"/></a></figure>



<p class="wp-block-paragraph">上図を表示しているデータは、以下です。sheet1には順次新しい投稿が書き込まれて、それを更新日時でSORTしたものがsheet2へ入り、その最新行からsheet3をコピーしています。</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=IoyR23xN.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=IoyR23xN.png" alt=""/></a><figcaption class="wp-element-caption">Twitterについては、投稿の重複は拒否されるので、その点の工夫が必要。</figcaption></figure>



<p class="wp-block-paragraph">「拡張機能」→「Apps Script」の中に記述したスクリプトは、全部掲載します。</p>



<p class="wp-block-paragraph"><a href="https://imakat.com/page-220507-2/" target="_blank">複数SNSの送信GAS</a></p>



<h4 class="wp-block-heading">＜２＞　Twitterを使えるようにする。</h4>



<p class="wp-block-paragraph"><strong>Twitter</strong>ですが、災害発生時には最も実績のある情報発信ツールであることは、東日本大震災他大災害の時を振り返れば明らかです。ただ、利用者が多いからか、イタズラや不正利用を防止せねばならず、APIのような、外部からアクセスできるツールに対する許可は、敷居が高い印象がありました。</p>



<p class="wp-block-paragraph">しかし、申し込んでみると結構すんなりいけます。最近、APIが、APIv1.1からAPI v2にバージョンアップしました。どうもAPI v2から直接使う方法が分かりにくく、色々調べて、TwitterAPI v2をEssentialから<strong>Elevated(無料）</strong>へ引き上げる方法が良さそうです。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=uZeL8qSA.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=uZeL8qSA.png" alt="" style="width:584px;height:668px"/></a></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">引き上げる際に、許可が必要で、用途に関する質問に英語で返答する必要がありますが、簡単な英語で書いても大丈夫かと思います。数多く解説のブログが書かれていますが、例えば<a rel="noopener" target="_blank" href="http://pineplanter.moo.jp/non-it-salaryman/2021/07/17/gas-twitter/">このブログ<span class="fa fa-external-link external-icon anchor-icon"></span></a>は分かりやすいです。</p>



<p class="wp-block-paragraph"><br>引き上げておいて、<br>OAuth1.0aのみにチェック<br>OAUTH1.0A SETTINGS でRead and writeにチェック<br>CallbackURI/RedirectURL ,WebsiteURL,Terms of service,Privacy policyは、https://twitter.com<br>と設定します。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=CuVR3D75.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=CuVR3D75.png" alt="" style="width:576px;height:653px"/></a></figure>



<p class="wp-block-paragraph"><br>Twitterは、同一内容の複数投稿は拒否するようです。その辺りは、GoogleSSのカラムに前回の投稿内容をコピーして今回の投稿内容と比較して、同じ場合は、tweet.gs内でルーチンを通さないようにしました(上のGASを参照）。</p>



<p class="wp-block-paragraph"><br></p>



<h4 class="wp-block-heading">＜３＞　AppSheetで作ったアプリはプロの仕上がり感</h4>



<p class="wp-block-paragraph">AppSheetは、各SNSのロゴをイメージとして読み込んで表示するだけのことですが、上の図のように、プロが作ったようなアプリになります。そこが素晴らしい。</p>



<p class="wp-block-paragraph">課題点というか仕方ない点としては、各SNS別に送信履歴を残していない点です。これはまあ、各アプリ側では当然履歴として残っていますのでそれで十分でしょう。</p>



<p class="wp-block-paragraph">現状は、各SNS側の画面から通知文の修正は出来ないようになっています。しかし、基本となる通知文を作った後で、それを各アプリ側でコピーして、各アプリ側で修正して送信する、という流れの方が素直かも知れません。<br>このあたりは、AppSheetとGASの連携の開発が進むと、すぐに可能になりそうです。しかしながら、今回のものでも、特に不便は感じません。</p>



<h4 class="wp-block-heading">＜４＞頻繁にテスト出来ない悩み</h4>



<p class="wp-block-paragraph">この複数通知の仕組みを作って思う課題、課題というか悩みは、頻繁にテスト出来ないことです。なにしろ、緊急通知が目的ですから、滅多に通知なんか発信されるものではないです。テスト用にそれぞれIDやアドレスを作ったとしても、実用としては常に本番用のアドレスにしておかなければ意味がありません。そんなわけで、実際に全部テストできるのは、年に一度の「防災訓練の日」の活動の一環としてテスト送信させてもらう、ということになります。</p>



<p class="wp-block-paragraph">そこがちょっと不便なところ。</p>



<p class="wp-block-paragraph">でも多くの方は、そんな緊急発信のためではなく、いわゆる普通の「伝言板」「回覧板」的な使い方になると思いますので、十分、応用できると思います。</p>



<h4 class="wp-block-heading">＜５＞まとめ〜中途半端な規模の人たちのために〜懸念材料</h4>



<p class="wp-block-paragraph">地方自治体で多いのは、「LINEに加入してアプリを入れて活用してください」型です。正直言ってLINEを嫌いな人もいるはず。しかし最近、だんだん、LINEに限定させず複数のSNSの中から、ユーザーが選択できる形式も増えてきました。</p>



<p class="wp-block-paragraph">スタッフの充実した都市の役所や大規模組織なら色々そうした工夫ができるでしょう。逆に、本当に小さい規模なら電話一本、伝言でOKでしょう。しかし<strong>大多数は、そのどちらとも言えない中途半端な規模</strong>の自治会、中途半端な規模のNPO。公民館はあるが住み込みは置けない。電話もない。自治会としてインターネット契約をすることは結構面倒なので、個人に契約者になってもらおうとすると、その個人がいつまで肩代わりしてくれるか保証はない。そうなると、Googleなどのサービスも無料で使えるものが中心となります。そんな人たちのために、少しでもお役に立てば嬉しいです。</p>



<p class="wp-block-paragraph">懸念材料としては、Twitter Botに有料化の動きがあること。GASやAppSheetの連携が自動化処理と見做されると停止されるか有料化されることを懸念します。つまり無料で使えるインターネットサービスは、減少していく方向にあるでしょう。</p>



<p class="wp-block-paragraph">以上です。</p>


]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">14993</post-id>	</item>
		<item>
		<title>【GAS】分散通知の仕組みを作る〜Googleアプリ、GAS及びAPIの活用　STEP3: LINEのメッセージ配信(3/5)</title>
		<link>https://imakat.com/2021/10/14/13982/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Thu, 14 Oct 2021 04:17:55 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[デジタル]]></category>
		<category><![CDATA[Googleスプレッドシート]]></category>
		<category><![CDATA[GAS]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[API]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=13982</guid>

					<description><![CDATA[＜分散通知の仕組みを作る　STEP3: LINEのメッセージ配信＞別ページで表示 iPhoneのLINE公式アカウントアプリには、「メッセージを配信する」機能があり、扱い易いです。しかしその扱いやすさの程度ですが、アプリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<hr class="wp-block-separator has-text-color has-key-color-color has-css-opacity has-key-color-background-color has-background is-style-wide"/>



<p class="wp-block-paragraph">＜分散通知の仕組みを作る　STEP3: LINEのメッセージ配信＞<br><span class="fz-12px"><a href="https://imakat.com/page-11646-4-2-2/" target="_blank">別ページで表示</a></span></p>



<img decoding="async" src="https://docs.google.com/drawings/d/e/2PACX-1vTTOSyFp0XDoz9QBQBS44O-VEXF_XlteV-PbnRZfwkVEKQh46dMZSSaKU0WBkYrOta-yO6kKzUVhhGG/pub?w=1440&amp;h=1080">



<hr class="wp-block-separator has-text-color has-key-color-color has-css-opacity has-key-color-background-color has-background is-style-wide"/>



<p class="wp-block-paragraph">iPhoneのLINE公式アカウントアプリには、「メッセージを配信する」機能があり、扱い易いです。しかしその扱いやすさの程度ですが、アプリを開く-&gt;「メッセージ配信する」をクリック-&gt;追加をクリック-&gt;テキストを選ぶ-&gt;テキストをコピペする-&gt;次へ-&gt;「すべての友だち」を選択して配信。という手順。</p>



<p class="wp-block-paragraph">確かにほとんど悩むことなく進めますが、やはり、余分なことを神経を使いながら覚える、そんな印象。</p>



<p class="wp-block-paragraph">このSTEP3における配信作業の流れでは、LINEのアプリは何も触りません。通知文がSTEP1で作成済みならば、STEP2とやることはほぼ同じです。ChromeからGoogleSSを立ち上げる-&gt;PC版サイトを選ぶ-&gt;iphoneを横向きにする-&gt;閉じるをクリック-&gt;内容を一応点検したら「LINE投稿」ボタンをクリック。という手順。</p>



<p class="wp-block-paragraph">LINEのいい点は、管理する側では、友だちの登録や削除などの作業は、何もないです。</p>



<p class="wp-block-paragraph">実に簡単です。</p>



<h3 class="wp-block-heading">ポイント解説</h3>



<h4 class="wp-block-heading">＜1＞ GoogleSSへの取り込み</h4>



<p class="wp-block-paragraph">送信する内容はコンパクトに、LINEの吹き出し１個だけです。</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=Bi9yU0XL.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=Bi9yU0XL.png" alt=""/></a></figure>



<p class="wp-block-paragraph">この画面には、Googleフォームへ入力した通知文が取り込まれるため、内容を確認するだけです。問題がなければ、「LINE投稿」ボタンを押します。</p>



<p class="wp-block-paragraph"><strong>通知文の読み込み：</strong></p>



<p class="wp-block-paragraph">IMPORTRANGE関数を使います。<br>読み込みたいGoogleSSのURLが、下記のようになっていたとして、</p>



<pre class="wp-block-code"><code>https:&#47;&#47;docs.google.com/spreadsheets/d/【この部分】/edit#gid=0</code></pre>



<p class="wp-block-paragraph">【この部分】を以下の場所に当てはめてください。sheet1は実際のシート名、A20のところも実際のセル位置を当てはめてください。</p>



<p class="wp-block-paragraph">LINEでは、吹き出し枠一つの中に、タイトル〜本文〜関係リンクを一まとめにして入れています。</p>



<pre class="wp-block-code"><code>=IMPORTRANGE("【この部分】","sheet1!A20")</code></pre>



<h4 class="wp-block-heading">＜2＞APIの取得とGAS記述</h4>



<p class="wp-block-paragraph"><strong>APIの取得：</strong></p>



<p class="wp-block-paragraph">LINE公式アカウントを取得すると、そのユーザーIDで、下記のLINE Developersにログインして、LINE Messaging APIのアクセストークンを取得します。</p>




<a rel="noopener" target="_blank" href="https://developers.line.biz/ja/services/messaging-api/" title="LINE Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/imakat.com/wp-content/uploads/cocoon-resources/blog-card-cache/dc3da295cadbd7f1ebc1c79124500834.jpg?resize=160%2C90&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">LINE Developers</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://developers.line.biz/ja/services/messaging-api/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developers.line.biz</div></div></div></div></a>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>GASの記述：</strong></p>



<p class="wp-block-paragraph">このままコピペください。<span class="bold-red">赤字</span>は、例示です。</p>



<pre class="wp-block-code"><code>const notifyLine = () =&gt; {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
// LINE DevelopersのChannel Access Tokenを【アクセストークン】へ入れます。
const ACCESS_TOKEN = "【アクセストークン】"
// LINE Developersの自分のユーザーIDを【ユーザーID】へ入れます。
const USER_ID = '【ユーザーID】'
const url = 'https://api.line.me/v2/bot/message/broadcast';
const headers = {
  'Content-Type' : 'application/json; charset=UTF-8',
  'Authorization': 'Bearer ' + ACCESS_TOKEN,
};

const message = sheet.getRange(<span class="bold-red">3,1</span>).getValue();
const data = {
  'messages' : &#91;
    {
      'type':'text',
      'text':message,
    }
  ]
};

const options = {
  'method':'post',
  'headers': headers,
  'payload':JSON.stringify(data)
};

UrlFetchApp.fetch(url,options);
}</code></pre>



<p class="wp-block-paragraph">「みんな」に対してメッセージ配信する場合は、上記のように、APIの最後の部分にbroadcastを使います。</p>



<p class="wp-block-paragraph">iPhoneで使う時は、STEP2と同様に、上記のGoogleSSのLINE投稿ファイルを、今度はiPhoneで呼び出してから「PC版サイトを見る」を選択-&gt;iPhoneを横向きにする-&gt;上段に出る警告を「閉じる」-&gt;「LINE投稿」のボタンを押す。と、同じ手順になります。</p>



<p class="wp-block-paragraph">次のSTEP4では、Push7の新規プッシュ通知を、Push7のアプリを何も触らないで実行する方法を説明します。考え方はLINEと同じです。</p>



<p class="wp-block-paragraph"><a href="https://imakat.com/2021/10/15/14021/" target="_blank">STEP4</a></p>



<p class="wp-block-paragraph">以上</p>


]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">13982</post-id>	</item>
	</channel>
</rss>
