かずきち。の日記

サーバサイドエンジニアのつぶやき

YouTubeの再生速度を自由に変更するjavascriptを書いて、視聴環境を劇的に変更してタイパをあげよう

動画の再生スピードを変えたい!

かけた時間に対する「時間対効果」のことを一般にタイパと言う。
タイムパフォーマンスのことである。

動画視聴の広告をスキップしたりすることが簡単に思いつくかと思います。
今回はワンクリックで再生速度を変えるボタンを作っていきましょう。

YouTubeで再生速度を変える仕組みとは?

https://support.google.com/youtube/answer/7509567?hl=ja&co=GENIE.Platform%3DAndroid

YouTubeにはもともと再生速度を変更できる仕組みが用意されていますが、元々ある機能ではかゆい部分に手が届きません。
そこで自身で再生速度を自由に変更できるスクリプトを書いてしまいましょう。

javascript:(function() {    var video = document.querySelector('video');    if (video) {        var newSpeed = prompt("新しい再生速度を入力してください(例: 1.5):");        video.playbackRate = parseFloat(newSpeed);    } else {        alert("YouTube動画が見つかりませんでした。");    }})();

このスクリプトをURLとしてブックマークしてください。
あとは再生中にこのブックマークしたURLをクリックしてください。

そうするとポップアップが立ち上がり、何倍速で見たいか聞いてきます。ここで2や1.5といった数字を入力すると、動画の視聴スピードが上がります。
アプリを使うことなく、誰でも簡単にYouTubeの倍速再生ができる仕組みを導入できますので、興味ある人は使ってみてください。

もしかしてまだ数式入れ直してる?変動する範囲に合わせて、セルにオフセット関数を入れて時短しよう

こんなエクセルを見たら、範囲の合計を出してください

ここは職場です。
急に上司に「3/1~3/3までの収支」合計を出してと言われたら、あなたはどうしますか?

そんなの =SUM(B2:B4」と数式を入れるだけでしょ?と思い、作業をしている方…何年前の人ですか?

でも次の日、「3/1~3/2で計算し直して」と言われたら、数式を入れ直して、毎日こんな事していたら日が暮れます。
会社で何か集計業務をしている人はもう自動で計算してくれる関数を入れたシートを作っちゃいましょう。

オフセット関数で時短をする

オフセット関数というのは計算範囲を動的に変えてくれる関数だ。
$マークとか使いこなして、スマートに仕事しているようだが、日本人の多くは無駄な仕事をしている。
というか他人がエクセルとか見ているの好きなのだが、「この人は何をしているんだ…」という人は多い。

D5セルに

=SUM(OFFSET(B1,MATCH(D2,A2:A32,0),,F2-D2+1))

と入れてみる。

するとD2セルとF2セルと連動して、自動で選択した範囲の合計を出してくれる。

【金融】証券コードから一発で株式情報をスクレイピングするスプレッドシートを作ってみる【GoogleAppsScript22行】


株式情報をスプレッドシートに取り込みたい

証券コードでGoogle検索をすると上記のような市況や個別株式の情報が表示される。
この中の情報を一網打尽に転機するのは少し大変で、もう少し簡素化できると助かる。
というわけで今回は一連の指標を転機する作業を自動化するこころを目的とする。

完成形

まずGoogleスプレッドシート上に「追加メニュー」という新しいオリジナルメニューを追加します。

そのメニューは以下に証券コード追加メニューを新設します。

メニューを押すとこのように取得したいティッカーコード、証券コードを入力します。

今回はGOOGLEの株式情報を抽出したいので、「GOOGL」と入力します。
するとYahooファイナンス上から、Googleの市場情報を抽出して、スプレッドシートにリアルタイムに値を変更します。

GOOGLの株式情報を取得して、リアルタイムに置き換えます。
ここまでが一連の流れです。

どうやっているのか?

スプレッドシートにコードを加えて、改変しています。

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("追加メニュー")
    .addItem("証券コード登録","registCode")
    .addToUi();
}

function registCode(){
  var code = Browser.inputBox("ウォッチしたい証券コードを入力してくだい");
  Browser.msgBox(code+"の銘柄をウォッチリストに追加しました")

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const FValues = sheet.getRange('A:A').getValues();  //F列の値を全て取得
  const LastRow = FValues.filter(String).length;  //空白の要素を除いた長さを取得
  Logger.log(LastRow);

  var startRow = LastRow+1

  sheet.getRange(startRow,1).setValue(code);
  
}

このメニューを追加することで、スプレッドシートに株式情報を追加するメニューを追加します。

次は市場情報を抜く必要があります

市場情報を人間が新聞から抜き出すのであれば、見出し1、見出し2


引用:
https://senior-next.com/my-next-life/newspaper-stock-price/

目視で抽出する必要があります。
一方で機械から市場情報を抜くときはXpathを利用して、情報を抽出します。
Xpathという技術はどんな場所で使われるかというと、機会を自動化するときにパソコンに場所を教え込む技術として使います。
要はXpathはウェブサイト上の部品の場所の在り処の書き方です。

まだわからないと思いますので噛み砕くと「場所の表し方の差」です。

例えば、東京駅の場所を示すときに
「東京駅」と言ってもいいですし、
「〒100-0005 東京都千代田区丸の内1丁目」と言ってもいいし、
「緯度は35.681236、経度は139.767125」と言ってもいいわけです。

人間は東京駅集合と言われれば、おそらくなんとなく東京駅中央改札に集まるかと思います。
でも機械はアホなので、東京駅の警備員室なのか?東京駅の広場なのか?わからないのです。
なので、機械には緯度経度や電話番号、マップコードなどできちんと指定しないといけません。

インターネットでいうと見出し1、見出し2とかいうアバウトな表現はよくないのです。
料理も3分弱じゃなくて、3分10秒とか指定しないといけないのです。

Xpathというのはウェブサイト上の文字列の具体的場所、位置を指定する方法です。

ウェブサイトでは各パーツに場所やアドレスが指定されています

/html/body/div[1]/div[2]/main/div/div[2]/div[1]/div[2]/section[1]/div[2]/header/div[1]/h2

この意味不明な文字列がインターネットでいうパーツの「場所」を表すアドレスです。
ここを知ることでウェブサイトの指定の部品(=文字列)のみを抽出できます。

docs.google.com

こちらにアクセスすると証券コード登録メニューがありますので

こちらに自分の好きな証券コードを記入してください。

すると即時マーケット情報を取得してスプレッドシートに書き込んでくれますよ。


メニューを表示するのに使用したコード
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("追加メニュー")
    .addItem("証券コード登録","registCode")
    .addToUi();
}

function registCode(){
  var code = Browser.inputBox("ウォッチしたい証券コードを入力してくだい");
  Browser.msgBox(code+"の銘柄をウォッチリストに追加しました")

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const FValues = sheet.getRange('A:A').getValues();  //F列の値を全て取得
  const LastRow = FValues.filter(String).length;  //空白の要素を除いた長さを取得
  Logger.log(LastRow);

  var startRow = LastRow+1

  sheet.getRange(startRow,1).setValue(code);
  
}

この株式情報を取得するためには実は22行ほどコードをプログラミングしています。
プログラミングはちょっとハードルが高そうですが、たった書いたコードは 22行です。
これだけで誰でも使いやすいカスタマイズされたスプレッドシートが作成できてしまいます。
他にも色々応用できますので、ぜひ使ってみてください。

【GoogleAppsScript】スプレッドシートのメニューバーを追加して、特定セルのみ記入できるアプリを作っていく


社内ITの悩み

いろんな社員がエクセルやスプレッドシートをいじって、シートがめちゃくちゃになる。


A列は編集させたいけど、B列はいじっちゃだめ
Aのシートはいじっていいけど、Bのシートはマスターシートなのでいじっちゃだめ

こんな運用をしている人も多いのではないでしょうか?
しかもそんな運用を口頭でやっていたらルールが破綻するのは見えているので、Google側で制御していきましょう。

今回はスプレッドシートに専用のメニューボックスを作っていきます

完成形態はGoogleスプレッドシートのメニューに専用メニュを作り、
なおかつ作ったメニューに特定の限定した挙動を登録します。

function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu("追加メニュー")
.addItem("証券コード登録","registCode")
.addToUi();
}

「ファイル」「編集」「表示」「挿入」「表示形式」「データ」「ツール」「拡張機能」「ヘルプ」の隣に
「追加メニュー」というメニューが表示されている。
これはonOpenで書かれておりスプレッドシート起動時にスクリプトが読み込まれるのと自動で発火する。

uncle-gas.com
引用:
スプレッドシートにカスタムメニューを追加する方法 | GASおじさんのブログ

日本語で書くと
スプレッドシートを開いたときに追加メニューという新規メニューを作っちゃいなさいというおまじないである。
プログラミングで実行するコマンドを「ボタン」に詰め込んでカプセル化できるので、ユーザー部門にソフトウェアを納品する機会がある人はぜひ覚えておきたい機能である。

満足いただけなければ全額返金キャンペーンを自動収集カレンダーをGoogleAppsScript60行で作成してみた

世の中には「満足いただけなければ、全額返金する」というキチガイなキャンペーンがある


引用:https://static.fbmarke.jp/origin-zengaku/

購入から14日以内の消印とレシートに限り、全額返金するという内容である。
まぁ消費者からすれば、太っ腹な企画なわけで返金してくれるのかと驚く。
昔はこんな企画はなかったと思うが、近年、このようなマーケティング戦略が増えつつある。

どうしてこんなにキチガイな企画が増えているのか?

自分なりに考えるとこによると、

①日本人の性格として、使ったあとに返金させるのは申し訳ないと思う人が多そうだから、返品する人は少ない?
②いちいちレシートを送付するくらいなら、買ったほうがまし
③日本の国土は諸外国に比べると狭いので、このようなキャンペーンをしても送料を食うことがない。アメリカでこののキャンペーンをやったら大変。

といった理由からではないか?と考えている。

①日本人の性格として、使ったあとに返金させるのは申し訳ない

すでに使っているのに、空箱とレシートを送付しても返金をしてくれるという注意書きである。
日本人の性格を逆手に取った企業のマーケティング戦略のようにしか思えない。
返金してもらえるならしてもらいましょう。
「する」と言ってるんだから。

②いちいちレシートを送付するくらいなら、買ったほうがまし

昔だとダンボールに宛先を書いて、コンビニで宅急便の伝票を書いて、現金書留を受け取るなんて面倒くさい作業をしなくてよくなりました。
宅急便を出すときはコンビニから出すなんていう風習はもはや時代遅れです。
今はLINE一本で家に荷物を取りに来てくれて、お時間指定便などもできる。
雑に扱っているようだが、クロネコヤマトは全国に配送拠点を持っており、トラックの中で荷物を保管することもできる。


引用:
https://dcross.impress.co.jp/docs/usecase/000396.html

つまり数年前から比べたらかなり仕組み化されてきているわけである。

物流は1つ送るのも、100個送るのも大して変わらない

クロネコヤマト、佐川急便、日本郵便、カンガルー便、UPS、FEDEXといった複数の配送業者があるが、共同配送という仕組みがあるので輸送コストがそこまで上がらない。
テレビや新聞に広告を打つより、返金キャンペーンをやったほうがコンバージョンがいいのであろう。
そもそも日本人の性格としてあまり返金する人はいないと思われるので。
そんな返金イェンペーンをしている全国の一覧を網羅するカレンダーを作ってみたいというのが今回の目的で
世の中でやってるおいしいキャンペーンを逃すのは嫌なので、自動で収集するようにしてみた。

function notsatisfaction() {

  // url設定

  var url = 'https://news.google.com/rss/search?hl=ja&gl=JP&q=%E6%BA%80%E8%B6%B3%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0&ceid=JP:ja';

  // namespace設定

  var namespace = XmlService.getNamespace("ht",'https://news.google.com/rss/search?hl=ja&gl=JP&q=%E6%BA%80%E8%B6%B3%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0&ceid=JP:ja');

  // rss取得

  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
  var link = channel.getChildren("link");

  // sheetに記入

  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;

  //for(var i = 0; i < length; i++) {
  for(var i = 0; i < 5; i++) {

    var title = items[i].getChildText("title");
    var link = items[i].getChildText("link");
    var traffic = items[i].getChildText("approx_traffic",namespace);

    Logger.log(link);
   
    
    //登録するカレンダーIDを呼び出してeventへ格納
    var calendar = CalendarApp.getCalendarById('返金カレンダーID@group.calendar.google.com');
    
    //イベントのタイトルをtitleへ格納
    Logger.log(title);
    
    var date = new Date();
    // 今日の日付を表示
    Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'));
    var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd');
    const option = {
    description: link,
    location: '日本'
  }
    
    Logger.log(today);
    
    //createAllDayEventでカレンダーへイベントを登録
    calendar.createAllDayEvent(title,new Date(today),option);
    
  }
}

という60行ほどのコードで完結した。
これで日本獣でやってる「返金保証付き」のキャンペーンを一網打尽で抑えることができる。
興味ある人は使ってみてください。


あなたの出身地はどこ?新入社員・新入生レクレーションツールの作り方


春は新入生・新入社員が入ってくる時期

その度に懇親会という名の飲み会であったり、様々な交流会が催されます。
でも毎回、上司や同僚に「君はどこの出身なの?」と無駄な時間を費やすことになります。
今回はそんな場でありがちな「出身地の自己紹介」を兼ねたインタラクティブな自己紹介ツールを作成していこうと思います。

Googleフォームで新入生・新入社員の自己紹介フォームを作成する

まずは簡単に自己紹介を回収するフォームを作成します。
特に何も仕掛けもないので、適当に作って頂いて構いません。
用途によって、趣味やスポーツなどの項目を追記すると良いでしょう。

次にいただいた情報をインタラクティブに可視化したいので、LookerStudioというGoogleのBIツールを使います

lookerstudio.google.com

BIツールとは

BIツール(Business Intelligence Tool)とは、企業が蓄積しているデータを集約・分析して、経営や業務に活用できるようにするツールです。BIツールには、従来型の「トラディショナル BI」と、近年主流となりつつある「モダン BI」の 2 種類があります。
BIツールは、企業が持つさまざまなデータを集約することで、データを抽出、加工し、わかりやすいグラフやレポートとしてまとめることができます。企業はそれらの結果をもとに、今後の経営や営業分析を行うことができます。

と生成AIが回答してくれます。
昔までだったらエクセルでポチポチしていた作業を人工知能が一括で可視化してくれるツールです。
もはや難しい関数などは必要ないです。

Googleフォームでこんな回答を回収することができます。
しかし人間がこのデータを加工するという作業が入ってしまい、無駄です。
ここでBIツールの登場です。
今回はLookerStudioというBIツールを使用します。

エクセルとの違いはデータの反映が30分に一回などに設定でき、可視化に優れています。
データに直結してビジュアライズしてくれます。
エクセルでも同様の事はできますが、今日はビックデータが主流ですので…

「A1のセルにこの関数を設置して」

みたいなことをやっていると日が暮れます。
もはやコンピュータが自動的に最適なグラフや最適な処理を推薦してくれて、ビジネスに役立つデータを作成してくれます。

新卒太郎くん 2018年度新卒は東京出身なので、東京の箇所に自動的にピンが経ちます。
ここを大阪、名古屋、福岡のように複数人の人がいれば当然、地図の全国にピンが立ちます。

各種経済指標の「予想と結果」をひたすらGoogleカレンダーに記録していくスクリプトを60行で書く

毎日なんかしらの経済指標が発表される

みんかぶなどのサイトでは各種経済指標の予測と結果が発表される。

fx.minkabu.jp
引用:
https://fx.minkabu.jp/indicators/US-NFP

経済指標とはいろんな国の活動がどうだったか?び答え合わせをしていて、
米国失業率の予想が1.0%に対し、米国失業率が0.9%だったら…

「アメリカの経済って思ったほど悪くないじゃん」

ということで、米ドルの価値はドル安からドル高に振れるようなものである。

ただ経済指標の発表は1週間に何度も行われていて、追うのが大変

失業率とか、物価指数とか…
いちいち追っていたら大変なので、自動化して市場の予想と結果を順次取り込みたい。

例えば「米国 完全失業率:予想0.9%が結果1.0%だった際に」だったら、
市場は予想より米国の雇用状況は悪いんだということで、ドル安に振れるように。

60行ほどでスクレイピングするコードを書いてみる

スクレイピングというのは特定のサイトをターゲットとして必要な情報を抜き出す行為である。
例えばAmazonのサイトの全商品の価格推移を随時トレースすることができれば、Amazonで賢い買い物ができ、最安値で購入することができる。
経済指標において言えば、いろいろ発表がなされる中で情報を自動で取り込みたい。
年末年始で余裕があったので、さくっとコードを書いてみる。

function read_mail() {
  const threads = GmailApp.search('結果発表 label:"経済指標" is:unread', 0,1);
  const messages = GmailApp.getMessagesForThreads(threads);
  for (const message of messages) {
    for(const m of message) {
      const s = m.getPlainBody();
      var splitTexts = s.split("■");
      //■で各経済指数をsplitする
      //console.log(splitTexts);
      for(let splitText of splitTexts){
      //console.log(splitText);
      //「都」が含まれているかの検索
      //console.log(splitText.match('━━━━━━━━━━━━━━━━━━━')); 
        if(splitText.match('────────────') == null){
          if(splitText.match('変動幅')  != null){
            var splitText2 = splitText.split("(");
            console.log(splitText2[0]);

            var splitText3 = splitText.split("変動幅:");
            console.log(splitText3[1]);

            //A現在使っているGoogleカレンダーを取得
            //const calendar = CalendarApp.getDefaultCalendar();
            const CalenderID = "自身のカレンダーID@group.calendar.google.com";
            let calendar = CalendarApp.getCalendarById(CalenderID);

            //カレンダーに登録する内容を定義
            const title = splitText2[0]+splitText3[1];  //予定のタイトル

            //Dateオブジェクトからインスタンスを生成
            let today = new Date();
            //日付フォーマットをyyyy年MM月dd日に変更
            let  startTime = Utilities.formatDate(today,'JST','yyyy/MM/dd HH:00:00');
            //今日の日付を実行ログに出力
            Logger.log(startTime);
            // 開始日時
            var startTime2 = new Date(startTime);

            //日付フォーマットをyyyy年MM月dd日に変更
            let  endTime = Utilities.formatDate(today,'JST','yyyy/MM/dd HH:30:00');
            //今日の日付を実行ログに出力
            Logger.log(endTime);
            // 終了日時
            var endTime2 = new Date(endTime);

            //オプションを付けて送信
            const options = {
              description: "詳細な情報を記入できます。", //詳細
              location: "日本" //場所
            }

            //C, Googleカレンダーに予定を登録
            calendar.createEvent(title, startTime2, endTime2);
          }
        }
      m.markRead();
      }
    }
  }
}

60行で完成した。
このソースは経済指標が発表されると、結果と予想値を記述して、何pip変動がおきるかを予想する。

どのように動くかというと30分に1回経済指標の変動幅の予測と結果を自動でトレースする

随時、経済指標の予想と結果をこのように書き込む。

で公開していますので興味ある人はご活用ください。
またこんなカレンダーあったら嬉しいという方はコメントください。
できる範囲で実装したいです。

【プログラマー×投資家向け】Googleフォームから動的な情報収集カレンダーを重複無しでGoogleAppsScript40行で作っていく【情報収集】

情報収集を毎日定期的に行ってくれるカレンダーを作成したい

世の中では投資目的で特定の会社が投資家向けにIR情報を出している。
「2024年度3月度決算」など各企業はいろんな情報を公開している。
いちいち各企業のサイトに飛ぶのはめんどくさいので、今回はGoogleフォームを使って動的に情報集するプログラムを作っていく。

作り方は
①まず情報収集したい企業名をGoogleフォームを使って収集
②次にすでに自分の所有するカレンダー群に該当の企業名のカレンダーがないか判定をかける。
③判定フラグが0の場合は該当のカレンダーがないので、新規にカレンダーを作成する。
 判定フラグが1の場合はすでに該当のカレンダーが存在するので、カレンダーIDを返却する。

この3つの方針で作成していく。

①の工程でまずは該当のGoogleフォームを作成していく

ただ企業の情報を収集したいので企業名を入力するだけのフォームを作成する。

回答にはこのようなタイムスタンプと企業名が入ったシートが完成するようにフォームを作る。

③の工程では入力された企業名のGoogleカレンダーがすでに存在するのかの判定していく
//スプレッドシートIDを元にスプレッドシートを取得するサンプルコード
function sampleCodeForOpenSheetById(){
  const sheet1 = SpreadsheetApp.openById("先程のフォームで回収した回答のスプレッドシートのid").getSheetByName("フォームの回答 1");
  //const value1 = sheet1.getRange('A1').getValue();
  //console.log(value1);

  //スプレッドシートを取得
  let mySheet = SpreadsheetApp.getActiveSheet();
  
  //読み込んだシートの最終行を取得する
  let lastRow = mySheet.getLastRow();
  const value = sheet1.getRange('B'+lastRow).getValue();
  console.log(value);

  //すでに同一名称のカレンダーがあるか?
  let calendars = CalendarApp.getAllCalendars();
  //カレンダー有無フラグ
  let flag = 0;

  for (let i in calendars) {
    let calendar = calendars[i];
    let calendarName = calendar.getName();
    if(value == calendarName){
        console.log("すでに存在してるよ");
        let flag = 1;
    }
  }
  
  //カレンダーの有無調査
  console.log(flag);

  if(flag = 0){
    CalendarApp.createCalendar(value+"カレンダー");
    console.log("新規にカレンダーを作るよ");
  }else{
     var already = CalendarApp.getCalendarsByName(value+"カレンダー");
     console.log(already[0].getName()+"はすでにあるよ");
      console.log(already[0].getId());
  }
}

のプログラムを走らせる。

今回はすでにGooggleに関する情報を収集するプログラムが自動で走っているか判定をかける。

さくっと40行ほどで今回入力した企業名のカレンダーが存在するか判定して、Googleという企業に関する情報を収集する。
0の場合はカレンダーがない、1の場合はすでにカレンダーが存在するフラグを立てる。

8224e5a7cb2a6fbfd2054178ac6534a8aad75fff064beaeafb4df9bf61e8baae@group.calendar.google.com

というカレンダーIDですでに存在しているのでプログラムは新規に作成して、ない場合は新規に作る。
ここで特定の企業名の情報を格納する「箱」が完成したことになる。

function getgooglenews() {

  // url設定

  var url = 'https://news.google.com/rss/search?hl=ja&gl=JP&q=(気になる企業名に変更)&ceid=JP:ja';

  // namespace設定

  var namespace = XmlService.getNamespace("ht",'https://news.google.com/rss/search?hl=ja&gl=JP&q=GoogleAppsScript&ceid=JP:ja');

  // rss取得

  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
  var link = channel.getChildren("link");

  // sheetに記入

  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;

  for(var i = 0; i < length; i++) {

    var title = items[i].getChildText("title");
    var link = items[i].getChildText("link");
    var traffic = items[i].getChildText("approx_traffic",namespace);

    Logger.log(link);
    
    //登録するカレンダーIDを呼び出してeventへ格納
    var calendar = CalendarApp.getCalendarById('先ほど作成したカレンダーIDを動的取得@group.calendar.google.com');
    
    //イベントのタイトルをtitleへ格納
    Logger.log(title);
    
    var date = new Date();
    // 今日の日付を表示
    Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'));
    var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd');
    const option = {
    description: link,
    location: '345 Spear StreetSan Francisco, CA 94105 United States'
  }
    
    Logger.log(today);

ここではカレンダーに動的に情報を記入していく。
つまるとこ何をしてるかというと…
フォームにGoogleと書けばGoogleに関する情報を記載するプログラムを書いた。
最後に情報収集する時刻のトリガーを設定すれば未来永続動くようになる。

どんな人に役立つか?

特定の企業の情報を収集するのは人間が収集するのは簡単だ。
機械が自動で未未来永劫情報収集するのはGoogleフォーム×Googleスプレッドシート×GoogleAppsScriptで自動化しなければならない。
この作業は投資家にとっては企業名を入力さえすれば、あとはその企業のカレンダーを作って追記して行ってくれるので非常に助かる。

GoogleAdSenseの収益額を日本円で表示して、関係者には広告を表示しない設定にした

GoogleAdSenseはホームページを収益化する

世の中のブロガーやYouTuberはコンテンツを収益化して、生計を立てている。

GoogleAdSenseとGoogleAnalyticsを連動させれば、自身のコンソールに収益額が表示される。
しかしGoogleはアメリカの会社なので、収益額がドルベースで表示されてしまう。

GoogleAnalytics上で通貨の単位を日本円にするには

プロパティ設定→プロパティの詳細→通貨の表示で
ドルから円に変更をする。
するとAnalyticsのレポートのスナップショットに

円ベースの売上が出てくる。

広告はインプレッション数とクリック数によって単価が決まるが…故意の表示とクリックは無効である

そのため自宅からの閲覧の際にはタグを発火させないという工夫をしなければいけない。
例えば、フジテレビの収益源のひとつにテレビのコマーシャル収益があるが、フジテレビの社員が広告を見て費用が発生した広告費は
本来は広告主を広告主が払うのはおかしいでしょ?というのがGoogleの考え方で、
Googleタグマネージャーを使って誰に何を見せるのかを制限することができる。

この人にはこのコンテンツを見せて、
あの人にはあのコンテンツを見せないでということが詳細に設定可能なのがGoogleである。

javascriptで閲覧者のIPを抜くには
function () {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.open("GET","https://jsonip.com/",false);
    xmlhttp.send();

    hostipInfo = (new Function("return " + xmlhttp.responseText))();

    if (hostipInfo['ip']) return hostipInfo['ip'];
    return false;
}

タグマネージャー上でDOM Readyをトリガーとして、閲覧者の身元を特定するjsを埋め込む。
そうすることで、特定の条件のユーザにはコンテンツを表示しないという仕組みを設定することができる。

【GooleAppsScript】GoogleAppsScriptを使って紹介コードを発行するプログラムを立てる【10行】

クーポンで溢れる世の中に…

昨今はクーポンやコードで溢れる世の中になりました。
マクドナルドの会計もアプリでクーポン提示…


引用:
https://www.tokupay.jp/entry/mcdonalds-coupon

世の中買い物する際にクーポンコードを入力すると割引かれる世の中になりました。
もう紙のクーポンは時代遅れチオ言っていいでしょう。
そして今まではクーポンコードを発行するのは大企業であることが多かったわけです。
しかし2023年ではマクドナルド、Amazon、Appleといった大企業は当然、コードを払い出したビジネスを行なっています。
しかしクーポンコードや紹介コードといった数字を払い出せるのは大企業だけなのか?という疑問があります。
プログラミングが身近になった今、プログラミングさえできれば自身でクーポンコードも発行できるわけです。
それも各人にカスタマイズされたコードで。
今回はGoogleAppsScriptを利用して、一意なランダムなクーポンコードを払い出すプログラムを作っていきます。

まずはコードを発行するフォームを作成

Googleフォームを利用して、まずは個人に紐付けたクーポンコードを発行するフォームを作ります。
ここまでは5分ほどで作れるかとお思います。
そして氏名を入力すると個人に紐付いた紹介コードが発行されます。

docs.google.com

C列には動的に個人名を紐付けたコードが生成されます。
C列は白地ですが、
既存参加者1のクーポンコードは「7880717」
既存参加者2のクーポンコードは「5490823」
既存参加者3のクーポンコードは「3208043」

と報いな数字7桁が生成されます。
これらコードは白色の文字で他人からは非公開にしておきます。

次は各人専用のお友達紹介フォームを作成します。

こんなGoogleフォームを作りましょう。
個人に紐づけたコードを生成するので、シンプルなものでいいです。

function myFunction() {
  const sheet_id = '14Di4VkHSxNjxlTk11SxONQQmyQ1lAmJTpkr3fBjjO-8'
const sheet_name = 'フォームの回答'

  const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);

  const lastRow = sheet.getLastRow();
  
  //0以上1未満の乱数を生成
  let rand = Math.random();
  //1~100の整数になるように数値計算
  rand = Math.floor(rand*10000000)+1;
  sheet.getRange(lastRow,3).setValue(rand);
}

あとはGoogleフォームで個人特有の招待コードを発行する仕掛けを作ります
まずはフォームの回答という名前のシートのシート番号を自動で格納します。
既存参加者1のクーポンコードは「7880717」
既存参加者2のクーポンコードは「5490823」
既存参加者3のクーポンコードは「3208043」
のように無作為な乱数を個人に紐づけたいので

  rand = Math.floor(rand*10000000)+1;

Math.floor(rand*10000000)にしているのは小数を除外する事・コードが0から始まる小数点であることを除外するためにこのようにしています。

あとはC列に動的に

7880717

といった紹介者を特定するアフィリエイトidが格納されます。
とは言え、こんな長ったらしい数字を控えるのはめんどくさいので、コードを事前入力します。

紹介された人向け登録フォーム

ここで肝になるのが、entry.1301079923=7880717

phpなどを学習したことがある人はわかりやすいと思いますが、この形式はhtmlでいうGET型で次のページに変数を引き渡すのに使用されます。
試しにこのリンクを踏んでみましょう。

docs.google.com

するとこのフォームでは招待コード「7880717」という数字が事前に埋め込まれます。
あとは被紹介者がコードを手入力する必要がなく、紹介者の登録が行えます。

事前入力方式は大企業も利用する

昨今はインターネットで簡単にマーケティングができる時代になったので、これなら誰でも簡単に招待コード付き始められます。
コード自体は10行なので、きちんと使い方さえ誤らなければ、面白いサービスが使えます。