このページで紹介している情報はアトラシアンでサポートしていない内容に該当しますため、
リックソフト株式会社は、情報が適切であることを保証しません。このページで紹介されている情報の使用に起因する、または関連するいかなる損害についても、一切の責任を負いません。

これらの情報を参考にした作業は、お客さまの自己責任のもとで実施してください。万が一に備えて、バックアップを作成などリカバリーできる状態にしてからの作業や、事前に検証環境での十分な検証を行うことなどをおすすめいたします。

ステータス

作成担当
レビュー担当道場 秀三郎 [Ricksoft]
レビュー完了日

 

備考

※備考欄には動作検証時の製品のバージョン等を記載

質問

ある命名規則に従って、フィルターを作成しています。

今回、組織変更により部署名が変更されましたので、フィルターに含まれる部署名を変更したいのですが、現状として一括で編集できないため、手作業で変更する予定です。

しかし、フィルターの数が多いため一括で作業を行ない、作業を効率化したいと考えているのですが、そのようなことはできますでしょうか。

回答

大変申し訳ございませんが、JIRAの標準機能では、フィルター名を一括で変更することはできません。

一般ユーザーがフィルター名を変更できる範囲は下記になります。

  • 自分がオーナになっているフィルターの場合、手動でフィルター名が変更可能

共有フィルターの場合、JIRA管理者であればオーナーでなくても、JIRA管理画面からオーナーを変更した後にフィルター名を変更することが可能です。

また、共有されていないプライベートフィルターに関しては、JIRA管理者でもフィルター名を変更できませんのでご注意ください。

フィルターについての詳細は下記URLをご参照ください。
https://confluence.atlassian.com/jirasoftwareserver073/saving-your-search-as-a-filter-861256242.html


JIRAの標準機能以外の方法でのフィルター名一括編集についてですが、下記3点の方法で実現可能です。

  • DB >> searchrequest テーブルを修正し、一括変更(設定の反映には、JIRAの再起動が必要です)
  • アドオン開発
  • " ScriptRunner for JIRA "を利用し、一括変更用のスクリプトを作成

" ScriptRunner for JIRA "を利用してフィルター名一括変更を行うコードの例は、下記になります。

(warning) 下記スクリプトを本番環境で使用される場合は、必ず検証環境で検証し、動作を確認した後にしてください。


/**** 設定値開始  ****/
 
/* 実際に置換をせずチェックをしたい場合:true, 置換をしたい場合:false  */
boolean isDryrun = true;
 
/* 正規表現で検索したい場合:true、検索文字列が正規表現ではない:false */
boolean isRegexSearch = false;
 
/* 例:kengo という文字列を検索してヒットしたものを ohsaki に置換 */
String searchString  = "kengo";
String replaceString = "ohsaki";
 
/* 置換から除外したいフィルターIDがある場合指定フィルターIDのLong値をaddで追加していく */
java.util.List<Long> excludeList = new java.util.ArrayList<Long>();
 
/**** 設定値終了 ****/
 
/* 以降置換処理 */
log.error(String.format("REPALCE START(dryRun: %s)", isDryrun));
 
/* 各種マネジャーオブジェクト取得 */
com.atlassian.jira.issue.search.SearchRequestManager searchRequestManager = com.atlassian.jira.component.ComponentAccessor.getComponent(com.atlassian.jira.issue.search.SearchRequestManager.class);
 
 
/* JIRAに登録されている全てのフィルターを取得 */
final com.atlassian.jira.util.collect.EnclosedIterable<com.atlassian.jira.issue.search.SearchRequest> searchRequestIterable = searchRequestManager.getAll();
if (searchRequestIterable == null) {
    log.error("ERROR(searchRequestManager.getAll): !!NULL ERROR!!");
    return;
}
final java.util.Collection<com.atlassian.jira.issue.search.SearchRequest> searchRequestCollection = com.atlassian.jira.util.collect.EnclosedIterable.Functions.toList(searchRequestIterable);
if (searchRequestCollection == null || searchRequestCollection.size() == 0) {
    log.info("Not Found filter");
    return;
}
 
 
/* 全てのフィルターをループ処理 */
long searchResultCount = 0;
long excludeCount = 0;
long successCount = 0;
long errorCount = 0;
 
/* 正規表現文字をエスケープ */
if (isRegexSearch == false) {
    searchString = java.util.regex.Pattern.quote(searchString);
}
java.util.regex.Pattern searchPattern = java.util.regex.Pattern.compile(searchString);
 
for (com.atlassian.jira.issue.search.SearchRequest searchRequest : searchRequestCollection) {
 
    /* フィルター名 */
    String filterNameString = searchRequest.getName();
   
    /* 探索対象の文字列が見つからなかった場合次へ */
    if (searchPattern.matcher(filterNameString).find() == false) {
        continue;
    }
 
    searchResultCount++;
     
    /* 置換から除外したいフィルターIDの場合、スキップした旨をログ出力 */
    if (excludeList.contains(searchRequest.getId())) {
        log.error("EXCLUDE filter: ID>"  + searchRequest.getId() + " Name>" + searchRequest.getName());
        excludeCount++;
        continue;
    }
 
    /* 探索対象の文字列にヒットした場合、置換前のフィルター名をログ出力 */
    log.error("ORIGINAL filter: ID>"  + searchRequest.getId() + " Name>" + searchRequest.getName());
 
    /* 置換 */
    String updateFilterNameString = searchPattern.matcher(filterNameString).replaceAll(replaceString);
 
    /* 置換エラーの場合、エラー出力して次へ */
    if (updateFilterNameString == null) {
        log.error("ERROR(replaceAll): ID>"  + searchRequest.getId() + " Name>" + searchRequest.getName() + " = !!ERROR!!");
        errorCount++;
        continue;
    }
 
    successCount++
 
   /* dry runは実際にデータは更新しないで次へ */
    if (isDryrun == true) {
        continue;
    }
 
    /* データ更新 */
    searchRequest.setName(updateFilterNameString);
    searchRequestManager.update(searchRequest);
    log.error("SUCESS(update): ID>"  + searchRequest.getId() + " Name>" + searchRequest.getName());
}
 
log.error(String.format("REPALCE END(dryRun: %s): AllFilter(%d), SearchResult(%d), SUCESS(%d), EXCLUDE(%d), ERROR(%d)", isDryrun, searchRequestCollection.size(), searchResultCount, successCount, excludeCount, errorCount));


※補足

最後にフィルター名を変更するとJQLとかで  filter = フィルター名 の書式で使用していると、そのフィルターが動作に影響受ける場合があるのでご注意ください。