投稿者「管理人」のアーカイブ

Googleタグマネージャー(GTM)で、organic(検索エンジン)来訪ユーザーのみでトリガー発火させる

Googleタグマネージャー(GTM)で、organic(検索エンジン)来訪ユーザーのみ、トリガー発火させる設定

元ネタ
Reusing Google Analytics Campaign Information with GTM | Bounteous https://www.bounteous.com/insights/2018/05/09/utmz-campaign-info-ga/?ns=l

・organic(検索エンジン)来訪ユーザーの判定は、Googleアナリティクスの結果を使う
・cookieに書き込むので、2ページ目以降の遷移でも、この判定値を使える。

前提条件

GTMで、Googleアナリティクス タグが設定されていること

手順

UTMZ Cookie Replicator for GTM | Bounteous https://www.bounteous.com/insights/2017/12/18/utmz-cookie-replicator-gtm/
から、container JSON file(utmz-cookie-replicator.json)をダウンロード

ダウンロードした utmz-cookie-replicator.json を、Googleタグマネージャー(GTM)で、「管理」→「コンテナをインポート」で、タグマネに設定追加する。
これで、Googleアナリティクスの結果が、GTMのCookie値として変数に格納されるようになる。

トリガーで、下図のように、”トリガータイプ” → ”ページビュー” で、変数「JS – GA Medium」が出てくるようになるので、
”一部のページビュー”、”JS – GA Medium”  ”含む” “organic” という条件で  トリガーを作成する。

(1)GTM →(2) Googleアナリティクス タグ 発火 →(3)  GTMでGoogleアナリティクス結果Cookie値参照 でのトリガー→ (4)発火させたいタグ
という順にするため、(4)発火させたいタグでは、 「発行する前にタグを配信」に(2)のGoogleアナリティクス を指定する。

 

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ

Trelloのフリーワード検索 Ruby版

Trelloのフリーワード検索が、実際にあるのにヒットしなかったり、正規表現が使えないなど、使えないので、Trelloのカード タイトル と 詳細説明 をフリーワード検索するRubyスクリプトを書いてみた。

準備

trello app-key

https://trello.com/app-key
から、下記取得
キー:   →  config.consumer_key
トークン  → config.consumer_secret
秘密: → config.oauth_token

Ruby

Rubyで ruby-trello(https://www.rubydoc.info/gems/ruby-trello/)を使うので
gem install ruby-trello
しておく
require "trello"

search_pattern = "検索文字列(正規表現OK)" # / はエスケープ無しでOK

# 検索対象
is_search_name = true # カード タイトルを対象とするか?
is_search_desc = false # カード 詳細説明を対象とするか?

# 検索対象リスト
search_list_names = {
  "リスト1" => true,
  "リスト2" => true,
}

board_id = "XXXXXX" # Trello URLの https://trello.com/b/XXXXXX の部分

Trello.configure do |config|
  config.consumer_key = "キー"
  config.consumer_secret = "秘密"
  config.oauth_token = "トークン"
end

Trello::Board.find(board_id).lists.each do |list|
  nextif! search_list_names[list.name]
  # puts list.name
  list.cards.each do |card|
    # puts card.name
    puts "#{card.short_url} :#{list.name}:name: #{card.name}" if is_search_name && (card.name =~ /#{search_pattern}/) # / はエスケープ無しでOK
    puts "#{card.short_url} :#{list.name}:desc: #{card.desc}" if is_search_desc && (card.desc =~ /#{search_pattern}/) # / はエスケープ無しでOK
  end
end
↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ

タスク管理ツールTrelloとチャットワークをGoogle Apps Scriptで連携させてみた

タスク管理ツールTrelloとチャットワークをGoogle Apps Scriptで連携させてみた。
復習のためまとめておく。

環境:Windows10 (LinuxなどUnix的な環境なら不要なこと多しw)

やりたかったこと

Trelloで、セルフアサインのタスク管理で、

・Trelloで「未着手」→「作業中」にタスク移動
・Trelloで「作業中」→「確認待ち」にタスク移動
・Trelloで「確認待ち」→「完了」にタスク移動
・Trelloで「コメント」
時に、チャットワークにメッセージ送信

・Trelloで「未着手」→「作業中」にタスク移動
時に、移動したメンバーをカードに追加

事前準備

curl と jq と less

設定と確認で使用するツールの準備。自分のマシンに入っていなければ、下記などからインストールする。

curlのインストール – Qiita 
curl 

jqをWindowsマシンにインストールして使ってみる – Qiita 
jq 

(lessは日本語の文字化け解消化け対策。文字化けしないなら下記移行で省略OK)
Windows 7で利用するCUIコマンドを“単品”で追加するなら「GnuWin32」(1) – builder by ZDNet Japan 
Less for Windows 

TrelloのAPI必要情報の取得

trelloのAPIを使ってみる -シェルスクリプト- – Qiita
などを参考に、下記を取得する

  • 開発者向けAPIキーの取得  → APIKey
  • Tokenの取得  → APIToken
  • (Cardの情報を取得)

Trelloのボード情報の取得

TrelloのuserId はこれ → userId
以下{}でくくられた部分({userId} {APIKey}  {APIToken} などは)は、ご自身のモノに置き換えてください。
以下、
  • {}でくくられた部分の{}文字自体は取り除いてください。{userId}  → user01234  など)
  • cmdなどでのコマンドの入力は、表示上改行されているように見えても、改行しないで1行で入力してください。
curl “https://trello.com/1/members/{userId}/boards?key= “{APIKey}” &token= {APIToken} &fields=id,name” | less -F |  jq
   ↓
[
 {
  "name": "test",
  "id": "5cxxxxxxxxxxxxxxxxxxxxxxx"
 }
]
5cxxxxxxxxxxxxxxxxxxxxxxx がボードのIDです   → boardId
ボードが複数有る場合、対象のボードIDを記録しておいてください。

 

TrelloのWebhook登録のためのGoogle Apps Script準備

TrelloのWebhook API登録のために、Google Apps Scriptで doGet()とdoPost() とを空で作っておく

function doGet(e){

}

function doPost(e){

}

Google Apps Script 自体については、下記など参照

【初心者向けGAS】本当の最初の一歩!スクリプトエディタでプロジェクトを開く
【初心者向けGAS】はじめてのスクリプトを作成し、保存し、実行する

「公開」→「ウェブアップリケーションとして実行」

{GoogleAppsScriptUrl}をコピーしておく、
アプリケーションにアクセスできるユーザーは、登録段階では、「全員」にしておく(「全員」(匿名ユーザーを含む)ではなく)参考:Trello Webhook × GoogleAppsScript の連携してカンバンの分析を楽にして見る の 1. GASのURLの準備(公開設定は全員に)- Qiita 

{GoogleAppsScriptUrl} にアクセスできるか確認しておく

curl -I {GoogleAppsScriptUrl}
で、下記のレスポンスが帰ってくることを確認しておく。(ここで、403が返ってくると登録できない)
HTTP/1.1 302 Moved Temporarily

TrelloのWebhook登録

“test2″の部分は任意(スペースが入っていない方がトラブル少ない)
cmd でも bash でも通ること確認しているコマンド

curl -X POST -H “Content-Type: application/json” -d “{\”key\”:\”{APIKey}\”,\”callbackURL\”:\”{GoogleAppsScriptUrl}\”,\”idModel\”:\”{boardId}\”,\”description\”:\”test2\”}” https://api.trello.com/1/tokens/{APIToken}/webhooks/ | jq

下記の様なレスポンスが帰ってくれば成功

{
 "id": "5yyyyyyyyyyyyyyyyyyyyy",              ←  Webhook登録されたID
 "description": "test2",
 "idModel": "5cxxxxxxxxxxxxxxxxxxxxxxx",
 "callbackURL": "https://script.google.com/macros/s/AKkkkk/exec", ← 登録された{GoogleAppsScriptUrl}
 "active": true
}

登録できたか確認したい場合は、以下のコマンドで、上記の結果が帰ってきます。
curl https://trello.com/1/tokens/{APIToken}/webhooks/?key={APIKey} | jq

登録しなおしたい場合は、下記で削除して、再登録。
curl -X “DELETE” “https://api.trello.com/1/webhooks/{Webhook登録されたID}?key={APIKey} &token={APIToken}

チャットワークの情報取得

チャットワークのToken

API Token | Chatwork 

チャットワークのROOM_ID

API Token | Chatwork 

コード

エイヤで書いて、とりあえず動いたレベルのモノです。
下記の部分は、ご自身の環境に合わせてください。
var trelloKey = ‘{APIKey} ‘;
var trelloToken = ‘{APIKey} ‘;
var CHATWORK_TOKEN = ‘{チャットワークのToken}’
var ROOM_ID = ‘{チャットワークのROOM_ID}’

コードを変更した場合は、「公開」→「ウェブアプリケーションとして導入・・・」をクリック

プロジェクトバージョンで「新規登録」を選択。「更新」ボタンをクリックして保存
参考:GoogleAppsScriptで修正が反映されない – Qiita 

var trelloKey = '{APIKey} '; 
var trelloToken = '{APIKey} '; 
var CHATWORK_TOKEN = '{チャットワークのToken}'
var ROOM_ID = '{チャットワークのROOM_ID}'
  
//TrelloのWebhookから呼ばれる
function doPost(e){
  console.log('doGost()');
  
  var contents = JSON.parse(e.postData.contents);
  console.log(contents);
  var cardName ='';
  var shortLink = '';
  var message = '';
  var member = '';
  var cardShortLink = '';
  var actionType = contents.action.type;
  console.log('actionType = ' +  actionType);
  
  switch (actionType) {
  case "updateCard":
      console.log('updateCard');
      if(!contents.action.data.listAfter)
      {
        console.log('contents.action.data.listAfter 無し');
        return;
      }
      listAfterName = contents.action.data.listAfter.name;
      listBeforeName = contents.action.data.listBefore.name;
      if (((listBeforeName === '未着手') && (listAfterName === '作業中')) || 
          ((listBeforeName === '作業中') && (listAfterName === '確認待ち')) ||
          ((listBeforeName === '確認待ち') && (listAfterName === '完了')) 
            ){
              cardName = contents.action.data.card.name;
              cardShortLink = 'https://trello.com/c/' + contents.action.data.card.shortLink;
              member = contents.action.memberCreator.initials;   
              message = member + "さんが [" + listBeforeName + "] → [" + listAfterName + "] に移動";
              postChatwork(message, cardShortLink, cardName); 
              if((listBeforeName === '未着手') && (listAfterName === '作業中')){
                postUrl = "https://api.trello.com/1/cards/" + contents.action.data.card.id + "/idMembers?key=" + trelloKey + "&token=" + trelloToken + "&value=" + contents.action.memberCreator.id;
                console.log("カードにメンバーを追加 " + postUrl);
                sendHttpPost(postUrl);
                message = member + "さんをタスクのメンバーに追加しました。"
                postChatwork(message,cardShortLink,cardName);        
              }
          } else {
            return;
          }

      break;
  case "commentCard":
      cardName = contents.action.data.card.name;
      cardShortLink = 'https://trello.com/c/' + contents.action.data.card.shortLink;  
      member = contents.action.memberCreator.initials;   
      var comment = contents.action.data.text
      message = member + "さんがコメント。";
      optionMessage = "---\n" +
        comment + "\n" +
          "---\n" +
        "このコメントに返信・追加 → " + cardShortLink;
      postChatwork(message,cardShortLink,cardName,optionMessage);
      break;
  default:
      break;
  }
}

function postChatwork(messageBody,cardShortLink,cardName,optionMessage){
  messageBody = "【タスク管理】" + messageBody + "\n" +
    " (タスクカード: " + cardShortLink + " ) " + cardName;
  if(optionMessage){
    messageBody += "\n" + optionMessage ;
  }
  console.log('messageBody = ' +  messageBody);
  
  var options = {
    "method" : "post",
    "headers" : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    "payload" : {"body" :  messageBody, "self_unread" : "1" }
  }
  var url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID + "/messages"
  UrlFetchApp.fetch(url, options)
}

function sendHttpPost(url, message){
  if(!message){
    message = "";
  }
   var payload =
   {
     "message" : message
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

   UrlFetchApp.fetch(url, options);
}

//TrelloのWebhookから呼ばれることは無い
function doGet(e){
  console.log('doPost()');
}

デバッグ

console.log(); での出力を、”表示” → “Stackdriver Logging”  のログで確認していくことで確認できます。

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ

cmd.exeから管理者権限でタスクを終了させる

cmd.exeからパスワード無しで管理者権限でタスク名指定で終了させる

tasklist で表示されたイメージ名(下記で、xxxxxxxxxx の部分)を入れて、cmdで実行すると
マッチするタスク全て、管理者権限で終了(kill)される

powershell -NoProfile -ExecutionPolicy unrestricted -command “Start-Process -Verb runas -FilePath powershell.exe -ArgumentList ‘-command stop-process -Name xxxxxxxxxx -Force'”

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ

Ruby Windows 64ビット環境でWIN32OLE.new(“ScriptControl”)がエラーになるのを解消

64ビット スクリプト コントロール・Tablacus Script Control 64 https://tablacus.github.io/scriptcontrol.html
から、 tsc64_1090.cab をダウンロードし、
適当なフォルダに解凍してsetup.exeを実行
「Install」でインストール

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ