HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: php, тестирование, rest api, jira, google sheets, переменная txt_jql, jql-запрос, google apps script</p>
1 <p>Теги: php, тестирование, rest api, jira, google sheets, переменная txt_jql, jql-запрос, google apps script</p>
2 <p>Для начала вам нужна установленная Jira, у которой включен доступ по Rest API. Далее требуется веб-сервер, где вы можете запускать PHP-код. Всего одна страница:</p>
2 <p>Для начала вам нужна установленная Jira, у которой включен доступ по Rest API. Далее требуется веб-сервер, где вы можете запускать PHP-код. Всего одна страница:</p>
3 define('JIRA_URL', 'АДРЕС JIRA'); define('USERNAME', ИМЯ ПОЛЬЗОВАТЕЛЯ); define('PASSWORD', 'ПАРОЛЬ'); $txt_jql = 'JQL-ЗАПРОС'; $jql = array('jql' =&gt; $txt_jql, 'maxResults' =&gt; '1000'); $jdata = json_encode($jql); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL =&gt; JIRA_URL . '/rest/api/latest/search', CURLOPT_USERPWD =&gt; USERNAME . ':' . PASSWORD, CURLOPT_POSTFIELDS =&gt; $jdata, CURLOPT_HTTPHEADER =&gt; array('Content-type: application/json'), CURLOPT_RETURNTRANSFER =&gt; true, CURLOPT_SSL_VERIFYPEER =&gt; false )); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result); if (property_exists($result, 'errors')) { echo "Error(s) searching for issues:\n"; var_dump($result); } else { foreach ($result-&gt;issues as &amp;$issue) { echo($issue-&gt;key . "#" . $issue-&gt;fields-&gt;summary . "#" . $issue-&gt;fields-&gt;status-&gt;name . "~"); } }<p>В переменную<strong>txt_jql</strong>надо записать JQL-запрос, который отбирает нужные вам задачи из Jira. В Google-таблице нужно добавить функцию, которая будет загружать данные из Jira:</p>
3 define('JIRA_URL', 'АДРЕС JIRA'); define('USERNAME', ИМЯ ПОЛЬЗОВАТЕЛЯ); define('PASSWORD', 'ПАРОЛЬ'); $txt_jql = 'JQL-ЗАПРОС'; $jql = array('jql' =&gt; $txt_jql, 'maxResults' =&gt; '1000'); $jdata = json_encode($jql); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL =&gt; JIRA_URL . '/rest/api/latest/search', CURLOPT_USERPWD =&gt; USERNAME . ':' . PASSWORD, CURLOPT_POSTFIELDS =&gt; $jdata, CURLOPT_HTTPHEADER =&gt; array('Content-type: application/json'), CURLOPT_RETURNTRANSFER =&gt; true, CURLOPT_SSL_VERIFYPEER =&gt; false )); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result); if (property_exists($result, 'errors')) { echo "Error(s) searching for issues:\n"; var_dump($result); } else { foreach ($result-&gt;issues as &amp;$issue) { echo($issue-&gt;key . "#" . $issue-&gt;fields-&gt;summary . "#" . $issue-&gt;fields-&gt;status-&gt;name . "~"); } }<p>В переменную<strong>txt_jql</strong>надо записать JQL-запрос, который отбирает нужные вам задачи из Jira. В Google-таблице нужно добавить функцию, которая будет загружать данные из Jira:</p>
4 function get_from_Jira() { var ss = SpreadsheetApp.getActive(); var s = ss.getSheetByName("data"); var txt_url = "АДРЕС ВАШЕЙ СТРАНИЦЫ.php"; var obj_response = UrlFetchApp.fetch(txt_url); var txt_response = obj_response.getContentText(); var arr_response = txt_response.split("~"); arr_response.pop(); //удаляем последний пустой элемент массива var int_i = 0; var arr_task; for (int_i = 0; int_i &lt;= arr_response.length - 1; int_i++) { arr_task = arr_response[int_i].split("#"); arr_response[int_i] = arr_task; } s.clear(); s.getRange(1,1,1,3).setValues([['Key', 'Summary', 'Status']]); var r = s.getRange(2, 1, arr_response.length, 3); r.setValues(arr_response); }<h2>Почему не запрашивать напрямую из Google Apps Script'а данные из Jira?</h2>
4 function get_from_Jira() { var ss = SpreadsheetApp.getActive(); var s = ss.getSheetByName("data"); var txt_url = "АДРЕС ВАШЕЙ СТРАНИЦЫ.php"; var obj_response = UrlFetchApp.fetch(txt_url); var txt_response = obj_response.getContentText(); var arr_response = txt_response.split("~"); arr_response.pop(); //удаляем последний пустой элемент массива var int_i = 0; var arr_task; for (int_i = 0; int_i &lt;= arr_response.length - 1; int_i++) { arr_task = arr_response[int_i].split("#"); arr_response[int_i] = arr_task; } s.clear(); s.getRange(1,1,1,3).setValues([['Key', 'Summary', 'Status']]); var r = s.getRange(2, 1, arr_response.length, 3); r.setValues(arr_response); }<h2>Почему не запрашивать напрямую из Google Apps Script'а данные из Jira?</h2>
5 <p>Из соображений ограничения доступа: нам изначально надо было предоставить коллегам только информацию о названии и статусе задач, но не о содержании: если вы кому-нибудь дадите доступ к этому документу, то у него будет и доступ к вашему скрипту и я не нашёл способ, как скрыть логин и пароль к Jira в Google Apps Script.</p>
5 <p>Из соображений ограничения доступа: нам изначально надо было предоставить коллегам только информацию о названии и статусе задач, но не о содержании: если вы кому-нибудь дадите доступ к этому документу, то у него будет и доступ к вашему скрипту и я не нашёл способ, как скрыть логин и пароль к Jira в Google Apps Script.</p>
6 <p>Дополнительно, можно поставить базовую авторизацию, чтобы и к странице с выгрузкой данных из Jira никто не мог получить доступ. Дальше с данными загруженными в таблицу можно делать всё что угодно средствами Google-таблиц.</p>
6 <p>Дополнительно, можно поставить базовую авторизацию, чтобы и к странице с выгрузкой данных из Jira никто не мог получить доступ. Дальше с данными загруженными в таблицу можно делать всё что угодно средствами Google-таблиц.</p>
7 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
7 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
8  
8