LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Saturday, August 31, 2019

GitHubのプルリクの説明にテンプレートを作る


プルリクエストの説明にテンプレートを作れることを知ったのでやってみました。

手順
  1. テンプレートを使いたいリポジトリを開く
  2. pull_request_template.mdファイルを作成する
  3. テンプレートを作って保存する
  4. masterにマージする
  5. プルリクを作る
  6. テンプレートに説明を書く


手順の2, 3のキャプチャを残しておきます

pull_request_template.mdファイルテンプレートを作る

これをmasterにマージすると、次回プルリク作成時からコメントにテンプレートが表示されるようになりました。


参考

リポジトリ用のプルリクエストテンプレートの作成
https://help.github.com/ja/articles/creating-a-pull-request-template-for-your-repository

zendesk APIでグループの情報を取得したい


一覧の取得と各グループの情報を取得したくてリファレンスから情報を得ました。
  1. グループの一覧を取得する
    https://EXAMPLE.zendesk.com/api/v2/groups.json
  2. 特定のグループの情報を取得するhttps://EXAMPLE.zendesk.com/api/v2/groups/360005843012.json


1. グループの一覧を取得する
https://EXAMPLE.zendesk.com/api/v2/groups.json

レスポンス
{
  "groups": [{
    "url": "https://EXAMPLE.zendesk.com/api/v2/groups/360005923112.json",
    "id": 360005923112,
    "name": "sales",
    "deleted": false,
    "created_at": "2019-08-31T04:42:10Z",
    "updated_at": "2019-08-31T04:42:10Z"
  }, {
    "url": "https://EXAMPLE.zendesk.com/api/v2/groups/360005922532.json",
    "id": 360005922532,
    "name": "support-engineer",
    "deleted": false,
    "created_at": "2019-08-31T02:29:57Z",
    "updated_at": "2019-08-31T02:32:43Z"
  }, {
    "url": "https://EXAMPLE.zendesk.com/api/v2/groups/360005843012.json",
    "id": 360005843012,
    "name": "サポート",
    "deleted": false,
    "created_at": "2019-08-31T02:25:25Z",
    "updated_at": "2019-08-31T02:25:30Z"
  }],
  "next_page": null,
  "previous_page": null,
  "count": 3
}


2. 特定のグループの情報を取得する
https://EXAMPLE.zendesk.com/api/v2/groups.json

レスポンス
{
  "group": {
    "url": "https://EXAMPLE.zendesk.com/api/v2/groups/360005843012.json",
    "id": 360005843012,
    "name": "サポート",
    "deleted": false,
    "created_at": "2019-08-31T02:25:25Z",
    "updated_at": "2019-08-31T02:25:30Z"
  }
}


参考

Support API Groups
https://developer.zendesk.com/rest_api/docs/support/groups

zendeskで指定した担当者のチケットをAPIで取得したい


指定した担当者のチケットを取得する例を書きました。

https://EXAMPLE.zendesk.com/api/v2/search.json?page=1&query=created>2019-01-01%20type:ticket%20assignee:386276247732



リクエスト
https://EXAMPLE.zendesk.com/api/v2/search.json?
page=1&
query=created>2019-01-01%20
type:ticket%20
assignee:386276247732
意訳
各自のzendeskの結果をJSONで返す
結果の1ページ目
created>2019-01-01
チケット
担当者の名前やIDなど


assigneeについて(チケットの検索)
割り当てられたエージェントまたはその他のエンティティ。「none」、「me」、ユーザー名(フルネームまたは一部)、メールアドレス、ユーザーID、または電話番号を指定できます。


関連記事

zendeskで特定日以降のチケットをAPIで取得したい
zendeskで指定したグループのチケットをAPIで取得したい


参考

チケットの検索
https://support.zendesk.com/hc/ja/articles/203663206-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2

zendeskで特定のテキストを説明に含むチケットをAPIで取得したい


「テスト」が説明に含まれるチケットを取得する例を書きました。

https://EXAMPLE.zendesk.com/api/v2/search.json?page=1&query=created%3E2019-01-01%20type:ticket%20description:テスト



リクエスト
https://EXAMPLE.zendesk.com/api/v2/search.json?
page=1&
query=created%3E2019-01-01%20
type:ticket%20
description:テスト
意訳
各自のzendeskの結果をJSONで返す
結果の1ページ目
created>2019-01-01
チケット
説明およびコメント内のテキスト


関連記事

zendeskで特定日以降のチケットをAPIで取得したい
zendeskで指定したグループのチケットをAPIで取得したい


参考

チケットの検索
https://support.zendesk.com/hc/ja/articles/203663206-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2

zendeskで指定したタグのチケットをAPIで取得したい


supportタグのついたチケットを取得する例を書きました。

https://EXAMPLE.zendesk.com/api/v2/search.json?page=1&query=created%3E2019-01-01%20type:ticket%20tags:support



リクエスト
https://EXAMPLE.zendesk.com/api/v2/search.json?
page=1&
query=created%3E2019-01-01%20
type:ticket%20
tags:support
意訳
各自のzendeskの結果をJSONで返す
結果の1ページ目
created>2019-01-01
チケット
タグ


関連記事

zendeskで特定日以降のチケットをAPIで取得したい
zendeskで指定したグループのチケットをAPIで取得したい


参考

チケットの検索
https://support.zendesk.com/hc/ja/articles/203663206-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2

zendeskで指定したグループのチケットをAPIで取得したい



https://EXAMPLE.zendesk.com/api/v2/search.json?page=1&query=created%3E2019-01-01%20type:ticket%20group:GROUPNAME



リクエスト
https://EXAMPLE.zendesk.com/api/v2/search.json?
page=1&
query=created%3E2019-01-01%20
type:ticket%20
group:GROUPNAME
意訳
各自のzendeskの結果をJSONで返す
結果の1ページ目
created>2019-01-01
チケット
グループ名


関連記事

zendeskで特定日以降のチケットをAPIで取得したい


参考

チケットの検索
https://support.zendesk.com/hc/ja/articles/203663206-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2

zendeskで特定日以降のチケットをAPIで取得したい


zendeskにログイン状態でブラウザでAPIをたたいてみました。

https://EXAMPLE.zendesk.com/api/v2/search.json?page=1&query=created>2019-01-01 type:ticket

  • 「EXAMPLE」の部分は使用しているzendeskの名前に変更します
  • 「%3E」は「>」を意味します
  • 「%20」は半角スペースを意味します
  • page=1 を page=2 などに変更すると検索結果が複数ページにまたがる場合に次のページの結果を取得できます



パラメータの書き方が最初よくわかりませんでしたが、おそらくこうなっている。

リクエスト
https://EXAMPLE.zendesk.com/api/v2/search.json?
page=1&
query=created%3E2019-01-01
意訳
EXAMPLEは各自の設定による名前
検索結果の1ページ目
created>2019-01-01


以下はトライアルでたたいた結果です。

レスポンス
{
    "results": [{
        "url": "https://EXAMPLE.zendesk.com/api/v2/tickets/2.json",
        "id": 2,
        "external_id": null,
        "via": {
            "channel": "web",
            "source": {
                "from": {},
                "to": {},
                "rel": null
            }
        },
        "created_at": "2019-08-31T02:35:25Z",
        "updated_at": "2019-08-31T02:35:25Z",
        "type": null,
        "subject": "テスト",
        "raw_subject": "テスト",
        "description": "テストです",
        "priority": null,
        "status": "open",
        "recipient": null,
        "requester_id": 386276247732,
        "submitter_id": 386276247732,
        "assignee_id": 386276247732,
        "organization_id": 360616460352,
        "group_id": 360005922532,
        "collaborator_ids": [],
        "follower_ids": [],
        "email_cc_ids": [],
        "forum_topic_id": null,
        "problem_id": null,
        "has_incidents": false,
        "is_public": true,
        "due_at": null,
        "tags": [],
        "custom_fields": [],
        "satisfaction_rating": null,
        "sharing_agreement_ids": [],
        "fields": [],
        "followup_ids": [],
        "brand_id": 360002806472,
        "allow_channelback": false,
        "allow_attachments": true,
        "result_type": "ticket"
    }],
    "facets": null,
    "next_page": null,
    "previous_page": null,
    "count": 1
}


参考

チケットの検索
https://support.zendesk.com/hc/ja/articles/203663206-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%A4%9C%E7%B4%A2

Friday, August 30, 2019

courseraにJIRAのコースがありました


Agile with Atlassian Jira
https://ja.coursera.org/learn/agile-atlassian-jira



  • 個人的にすでに知っていることも多かったので、復習的にできました
  • JIRAの設定やアジャイル開発の基礎的なことを学習できる内容でした
  • 推奨は4週間で約11時間で修了と書かれていますが一気にやることもできました
  • 週毎のコンテンツの最後に確認テストがありました
  • 全編英語でした
  • 動画は2倍速で再生可能でした
  • キャプチャも多くてヘルプを見るよりわかりやすかった
  • 修了証を得るには有料です学習するだけなら無料でした


courseraのコースとは別ですが

公式のAtlassian Cerified Professionalというのもあるらしい
https://www.atlassian.com/university/certification

https://japan.blogs.atlassian.com/2016/08/atlassian-certified-professional-jira-administrator/


GASでAPIを作ってみる(ContentService)


Google Apps Script側でAPIを用意してJSONを返したい
の発展形で、アプリのURLにパラメータを渡して、一致するプロパティの値を返す仕組みを作ってみます。


APIとして値を返す側のコード

コード2.gsからパラメータを付けてコード1.gsのアプリのURLにアクセスして
コード1.gs内のobjを参照して
パラメータの文字列に一致するプロパティの値を返す


コード1.gs
function getObj() {
  var obj = {'hello': 'はろー', 'world': 'わーるど', 'foo': 'ふー', 'bar': 'ばー'}; 
  return obj;
}

function doGet(e) {
  var sentence = e.parameter.sentence;
  var obj = getObj();
  var json = JSON.stringify(obj);
  var matchValues = returnMatchValues(json, sentence);
  return ContentService.createTextOutput(matchValues)
  .setMimeType(ContentService.MimeType.JSON);
}

function returnMatchValues(json, sentence) {
  var jobj = JSON.parse(json);
  var words = sentence.split(' ');
  var matchValues = [];
  for(var i = 0; i < words.length; i++) {
    var word = words[i];
    var value = jobj[word];
    matchValues.push(value);
  }
  return matchValues;
}


APIをたたく側のコード

「hello bar」という文字列をコード1.gsのアプリのURLにパラメータで渡して
コード1.gs内のobjの一致するプロパティの値を受け取ってログに出す


コード2.gs
function getData() {
  var sentence = 'hello bar';
  var url = 'https://script.google.com/macros/s/コード1.gsをWebアプリとして導入した際のID/exec' + '?sentence=' + sentence;
  var response = UrlFetchApp.fetch(url).getContentText();
  Logger.log(response);
}


実行結果



補足
  1. コード1.gsとコード2.gsはそれぞれ新規プロジェクトで作成します
  2. コード2.gsはGASで書きましたが、ブラウザで以下のようにアクセスしても結果を得られます
    https://script.google.com/macros/s/コード1.gsのWebアプリのID/exec?sentence=hello foo

Module not found: Can't resolve 'axios' を npm install axiosで解決した


こんなエラーが出たので

Module not found: Can't resolve 'axios' in ' 〜


npm installして

$ npm install axios

解決した


参考

https://github.com/bradtraversy/devconnector/issues/23

GitHubでフォークしたリポジトリをSourcetreeでクローンしたい


Googleの blockly のGitHubリポジトリをフォークしてSourcetreeでクローンしたときの備忘録



google/blockly
https://github.com/google/blockly

GitHubのblocklyのリポジトリで「Fork」をクリックして自分のアカウントにフォーク



「新規」から「URLからクローン」を選択



「ソースURL」を入れてクローン

これでローカルにクローンできました。



フォーク元のリポジトリをリモートに追加してみる


リモートでコンテキストメニューを開いてリモートを追加


リモートの名前:upstream
URL / パス:フォーク元のリポジトリのURL


「OK」をクリック

これでリモートにフォーク元のリポジトリが追加されました。


参考

https://qiita.com/takanemu/items/a576038f091c850693bc

https://backlog.com/ja/git-tutorial/intro/14/

https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow

Monday, August 26, 2019

スプレッドシートのセルに入力されている日時から年月日と年月と何週目かを取得したい


日時はA列に入っている想定


B列に日付のみ抽出したい
=ARRAYFORMULA(MID(A2:INDIRECT("A"&COUNTA(A2:A)+1),1,10))


C列に年月のみ抽出したい
=ARRAYFORMULA(MID(B2:INDIRECT("B"&COUNTA(B2:B)+1),1,7))


D列にその年の何週目か取得したい
=ARRAYFORMULA(LEFT(B2:INDIRECT("B"&COUNTA(B2:B)+1),4)&"-"&TEXT(WEEKNUM(B2:INDIRECT("B"&COUNTA(B2:B)+1),2),"00")&"週")


補足

何週目か取得したい場合に、以下のようにやると
=ARRAYFORMULA(LEFT(B2:INDIRECT("B"&COUNTA(B2:B)+1),4)&"-"&WEEKNUM(B2:INDIRECT("B"&COUNTA(B2:B)+1),2)&"週")

1週目〜9週目が一桁になり
このようになってしまう

何週目
2019-10週
2019-11週
2019-12週
2019-13週
2019-14週
2019-15週
2019-16週
2019-17週
2019-18週
2019-19週
2019-1週
2019-20週
2019-21週
2019-22週
2019-23週


TEXT関数を利用してこう書くことで解決しました
=ARRAYFORMULA(LEFT(B2:INDIRECT("B"&COUNTA(B2:B)+1),4)&"-"&TEXT(WEEKNUM(B2:INDIRECT("B"&COUNTA(B2:B)+1),2),"00")&"週")

何週目
2019-01週
2019-02週
2019-03週
2019-04週
2019-05週
2019-06週
2019-07週
2019-08週
2019-09週
2019-10週
2019-11週
2019-12週


関連記事

特定の列の値から特定の文字だけ抜き出したい(ARRAYFORMULA関数で)
西暦とその年の何週目かをWEEKNUMとARRAYFORMULAで出してみる


参考

TEXT
https://support.google.com/docs/answer/3094139?hl=ja

Sunday, August 25, 2019

MacのTerminalで文字入力ができず「新規コマンド」で/bin/shを試した


Macのターミナルの調子がおかしくなったときに調べて一時的に解決した方法です。



ターミナル > シェル > 新規コマンド


/bin/sh > 実行


これで一旦入力はできるようになりましたが、起動する度にこの作業をやるのは手間なので、根本解決は別途必要です。


LINEのキャッシュを削除したい(Android)


LINEのキャッシュをアプリのストレージから削除する手順を書いていきます。


まず結論からいうと
ここでキャッシュを削除できました。




STEP1
「設定」をタップします


STEP2
「アプリと通知」をタップします


STEP3
「LINE」をタップします


STEP4
「ストレージ」をタップします


STEP5
「キャシュを削除」をタップします


補足

LIFF用のhtmlを更新しても反映されずになんでだろうと色々試したりググったりしていたら、Androidの場合、HTMLを更新してもLIFF上のHTMLは更新されないらしいことを知りました。

公式ページにその記述を見つけることはできませんでしたが、知見を残してくれている方がいて助かりました!
https://qiita.com/teramotodaiki/items/a8955840aa23ec68e6fe


参考

公式のヘルプでは「トークルーム内の一時ファイルを削除」が紹介されていました
http://official-blog.line.me/ja/archives/72213176.html
https://help.line.me/line/android/pc?lang=ja

しかし手元の環境で試すとその方法ではhtmlの更新が反映されず、ストレージからキャッシュを削除したら反映されるようになりました。

Tuesday, August 20, 2019

freee APIのトークン情報をスクリプトプロパティに保存して更新したい


Google Apps Scriptのスクリプトのプロパティにトークン情報を保存して、
リフレッシュトークンを使って更新するコードです。


実現したいこと

アクセストークンを取得したい
手順
  1. freeeにアプリを登録して、コード.gs の Client ID と Client Secretに入れる
  2. ウェブアプリとして導入する
  3. そのURLをfreeeのアプリのコールバックURLに入れる
  4. Webアプリ認証用URLをブラウザで開いてアクセス許可する
  5. ブラウザにアクセストークンが表示され、スクリプトのプロパティにも保存される

リフレッシュトークンで更新したい
手順
  1. refreshTokens() を実行する
  2. スクリプトのプロパティのトークン情報が更新される


それぞれ詳しくは以下2つの記事に書きました

初回アクセストークン取得の手順
freee APIでアクセストークンを取得したい

リフレッシュトークンで更新する手順
freee APIでリフレッシュトークンを使いたい



コード.gs
var client_id = 'Client ID';
var client_secret = 'Client Secret';


function doGet(e) {
  var response = getAccessToken(e);
  setScriptProperties(JSON.parse(response));
  return ContentService.createTextOutput(response);// ブラウザに表示する
}

/************************************
リフレッシュトークンを使ってトークン情報を更新してスクリプトプロパティを上書きする
************************************/
function refreshTokens() {
  var response = runRefresh(getScriptProperties('refresh_token'))
  setScriptProperties(JSON.parse(response));
}

/************************************
PropertiesService
************************************/
function setScriptProperties(jobj) {// スクリプトのプロパティに値を保存する
  PropertiesService.getScriptProperties().setProperties(jobj);
}

function getScriptProperties(key) {// スクリプトのプロパティから値を取得する
  return PropertiesService.getScriptProperties().getProperty(key);
}

//アクセストークン、リフレッシュトークン取得時に使うurl
var token_url = 'https://accounts.secure.freee.co.jp/public_api/token';

/************************************
認可コードを利用してトークン情報を取得して返す(初回のみ使用する)
次回からはリフレッシュトークンを使ってトークン情報を更新できる
************************************/
function getAccessToken(e) {
  var code = e['parameter']['code'];
  var payload = {
    'grant_type': 'authorization_code',
    'client_id': client_id,
    'client_secret': client_secret,
    'code': code,
    'redirect_uri': ScriptApp.getService().getUrl()
  }
  var response = UrlFetchApp.fetch(token_url, getOptions(payload));
  return response;
}

/************************************
refresh_tokenを使って更新したトークン情報を返す
************************************/
function runRefresh(refresh_token) {  
  var payload = {
    'grant_type': 'refresh_token',
    'client_id': client_id,
    'client_secret': client_secret,
    'refresh_token': refresh_token
  }
  var response = UrlFetchApp.fetch(token_url, getOptions(payload));
  return response;
}

/************************************
optionsを作って返す
************************************/
function getOptions(payload) {
  var options = {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    'payload': payload
  }
  return options;
}



関連記事

アクセストークンを取得したい
リフレッシュトークンを使いたい

Monday, August 12, 2019

テキストエリアに入力したら反応したい(oninput)


こういうテキストエリアを作りたい

デモ:
テキストエリアに入力したらアラートを出す





コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <textarea id="ta"></textarea>
    <script>
      document.getElementById('ta').oninput = myFunction;
    
      function myFunction() {
        alert('input');
      }
    </script>
  </body>
</html>



Sunday, August 11, 2019

複数の配列で共通する要素を取得したい(重複する要素を取得する)


以下のような3つの配列があって

  var A = [1, 2, 3, 11, 12];
  var B = [2, 16, 1, 3, 5, 4];
  var C = [3, 2, 16, 1, 12, 4, 7, 8, 9, 10];

共通する [1, 2, 3] を取得したい



コード.gs
function myFunction() {
  var A = [1, 2, 3, 11, 12];
  var B = [2, 16, 1, 3, 5, 4];
  var C = [3, 2, 16, 1, 12, 4, 7, 8, 9, 10];
  var arrays = [A, B, C];
  var duparray = getDuparray(arrays);
  Logger.log(duparray);
}

function getDuparray(arrays) {
  var duparray = arrays[0];
  for(var i = 0; i < arrays.length-1; i++) {
    Array.prototype.push.apply(duparray, arrays[i + 1]);
    duparray = duparray.filter(compareArrays);
  }
  return duparray;
}

function compareArrays(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index !== index;
  return result;
}



実行結果



補足

配列内に重複する要素がある場合
ユニークにしてからやらないと正確な結果を得られない

例えば以下のような配列を上のコード.gsで実行すると
var A = [3,13,19,29,59,61,69];
var B = [13,15,19,53,71];
var C = [4,6,6,7,7,8,8,13,13,19,53,53,57,57,60,60];

こうなる
 [6.0, 7.0, 8.0, 13.0, 13.0, 19.0, 53.0, 57.0, 60.0]

その対策として以下の コード2.gs のようにそれぞれの配列内の重複を除いてやると

こうなる
[13.0, 19.0]



コード2.gs
function myFunction() {
  var A = [3,13,19,29,59,61,69];
  var B = [13,15,19,53,71];
  var C = [4,6,6,7,7,8,8,13,13,19,53,53,57,57,60,60];
  var arrays = [A, B, C];
  arrays = getUniqueArrays(arrays);
  var duparray = getDuparray(arrays);
  Logger.log(duparray);
}

function getUniqueArrays(arrays) {// 配列内の重複をなくしてユニークにしてノイズを減らしておく(これやらないと正しくfilterされない)
  var uniqueValues = [];
  for(var i = 0; i < arrays.length; i++) {
    var array = getUniqueValues(arrays[i]);
    uniqueValues.push(array);
  }
  return uniqueValues;
}

function getDuparray(arrays) {
  var duparray = arrays[0];
  for(var i = 0; i < arrays.length-1; i++) {
    Array.prototype.push.apply(duparray, arrays[i + 1]);
    duparray = duparray.filter(compareArrays);
  }
  return duparray;
}

function compareArrays(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index !== index;
  return result;
}

function getUniqueValues(array){
  var uniqueRows = array.filter(compareUniqueValues);
  return uniqueRows;
}

function compareUniqueValues(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index === index;
  return result;
}



参考

Array.prototype.filter()

2次元配列を各配列の要素が少ない順に並べ替えたい


こういう配列があって
  var A = [1, 2, 3];
  var B = [4, 5];
  var C = [6, 7, 8];
  var D = [9];
  var E = [10, 11, 12, 13,14, 15];


このように配列の要素数が少ない順に並べ替えたい
 [[9.0], [4.0, 5.0], [1.0, 2.0, 3.0], [6.0, 7.0, 8.0], [10.0, 11.0, 12.0, 13.0, 14.0, 15.0]]



コード.gs
function myFunction() {
  var A = [1, 2, 3];
  var B = [4, 5];
  var C = [6, 7, 8];
  var D = [9];
  var E = [10, 11, 12, 13,14, 15];
  var arrays = [A, B, C, D, E];
  var asc = sortArrays(arrays);
  Logger.log(asc);
}

function sortArrays(arrays){
  var asc = arrays.sort(sorting);
  return asc;
}

function sorting(a, b){
  return a.length - b.length;
}
意訳
この機能がやること
配列を用意する




用意した配列を1つの配列に入れて二次元配列を作る
sortArraysに渡して結果を取得して
ログに出す


この機能がやること
渡された二次元配列内の各配列の要素数を比較して少ない順に並べ替えて
返す


この機能がやること
要素数を比較して 0未満は-1(aをbより前に), 0は0(順番はそのまま),  1以上は1(aをbより後ろへ)を返す(そして要素数が少ない順に入れ替えていく)



参考

Array.prototype.sort()

Thursday, August 8, 2019

JIRAのサブタスクを一括で完了にしたい


JIRAのサブタスクのステータスを一括で変更したくて試した方法です。

Subtasksの「…」を開いてみたらありました。


サブタスクを一括で完了にする手順


課題を開いて「…」をクリック


「Bulk edit」をクリック(日本語表記だと「一括編集」)


「Transition Issues」をクリック


「Done」を選択


「Next」をクリック


「Confirm」をクリック


処理中


処理完了




Tuesday, August 6, 2019

JIRAの解決状況の選択肢に表示する項目を指定したい


JIRAのワークフローで完了までに解決状況を入力するダイアログを出したい
JIRAのトランジション時に解決状況だけを選択する画面を作りたい
でステータス変更時にダイアログを表示することはできました。

次に探したのは、表示する項目をワークフローごとに設定できないか。


このように


探してみると、ワークフローのTransition Propertiesで設定できました。

以下に手順を書き残しておきます。


解決状況に、指定した選択肢だけを表示させる手順

「Project settings」


「Workflows」>「Actions」


「Done(41)」カッコ内の数値は環境によって異なると思います


「View Properties」


「Property Key」:jira.field.resolution.include
「Property Value」:10000,10001 ※カンマ,のあとに半角スペースを入れない
半角スペースを入れると先頭のIDの解決状況しか表示されなくなくなります
(IDの取得方法は補足に書きました)


1つ前のページに戻る


「Publish Draft」


「Publish」


これで指定した解決状況だけを選択肢に表示できるようになりました。


ぶつかった壁

カンマ区切りで複数のIDを指定する際

10000, 10001

のようにカンマのあとにスペースを入れると、
先頭のIDの項目しか表示されませんでした。

複数のIDには対応していないのかと思ってさらに調べてみると

ここでincludeが追加されたらしく、コメントを読んでいくと
カンマ(,)のあとにスペースを入れないように書かれていました。
https://jira.atlassian.com/browse/JRASERVER-16443
For anyone having an issue with this, make sure that you don't have spaces after the commas that are separating the values.


補足


解決状況のIDを知る方法

「Resolutions」 >「Edit」


アドレスバーの末尾にIDが表示されます


補足2


jira.field.resolution.excludeで非表示にする項目を指定することもできるらしい。



参考

ワークフロープロパティ設定
https://ja.confluence.atlassian.com/adminjiracloud/workflow-properties-776636709.html

Communityに投稿を見つけましたが、複数の場合の回答がついていなかった
https://community.atlassian.com/t5/Jira-questions/jira-field-resolution-exclude-doesn-t-work/qaq-p/402618

Create a jira.field.resolution.include transition attribute
https://jira.atlassian.com/browse/JRASERVER-16443

Saturday, August 3, 2019

JIRAのステータス名を変更したい


以下の手順ステータス名を変更すると
同じワークフローを使っているすべてのプロジェクトに影響します。



他のプロジェクトに影響させずに独自のワークフローを作りたい場合は
JIRAでワークフローをコピーしてスキームに設定したい
に書きました。


ワークフローのステータス名を変更する手順

STEP1
「Project settings」をクリック


STEP2
「Workflows」>「Actions」の鉛筆アイコンをクリック


STEP3
「Diagram」をクリック


STEP4
「To Do」をクリック


STEP5
Status名を変更


STEP6
試しに「Pending」に変えて「Save」する


ワークフローの「To Do」が「Pending」になります

STEP7
「Publish Draft」をクリックします


課題を開いてみると
ステータスの選択肢が「To Do」ではなく「Pending」になっています


補足

 STEP3で「To Do」をクリックして


「Edit」をクリックすると


「Step Name」を設定できる
「Linked Status」は編集できない




JIRAでワークフローをコピーしてスキームに設定したい


ワークフローの設定を変更しようとしたときに
「Generated by JIRA Software version 1001.0.0-SNAPSHOT. このワークフロースキームは、Jira Softwareにより内部管理されています。このワークフローを手動で変更しないでください。」
というメッセージがあったので、ワークフローをコピーしたときの備忘録です。



STEP1
「Project settings」をクリック


STEP2
「Workflows」>「Actions」の鉛筆アイコンをクリック


STEP3
「Workflows」をクリック


STEP4
対象ワークフローの「Copy」を選択します


STEP5
「Workflow Name」「Description」を任意の文言に変更して「Copy」


コピーが作成されました


コピーしたワークフローをスキームに紐付けます

STEP6
STEP2の画面に戻って、「Add Workflow」>「Add Existing」をクリック


コピーしたワークフローを選択して「Next」をクリック


「Issue Type」を選択して「Finish」をクリック


「Publish」をクリック


「Associate」をクリック

マイグレーションが始まります

終わるとこのようになるので「Acknowledge」をクリック


「Workflows」がコピーしたワークフローに変わります。


参考

課題のワークフローの追加と削除
https://ja.confluence.atlassian.com/adminjiracloud/adding-and-deleting-an-issue-workflow-844500765.html

Latest post

Extracting data from Google Sheets with regular expressions

Introduction Regular expressions are a powerful tool that can be used to extract data from text.  In Google Sheets, regular expressions ca...