ClickupのタスクをGASでごにょごにょしたいなと思い立って、調べ出したら思わぬ苦戦をしたという記録です。
GASはほとんどjavaScriptだから、だいたいそのつもりでいれば良い感じにやれるのですが、何かこう……ときどきしょっちゅう、違うんですよね。
下記ドキュメントに、GASのコード例も入れておいてほしい。javaScriptとは別に。
https://clickup.com/api/clickupreference/operation/GetTasks/
URLパラメータを作る関数がない
javaScriptにある URLSearchParams がGASで使えないらしいです。
しょうがないので、自分でパラメータを繋げてURLを作ります。
もっとかっこいい書き方で自作している例はたくさんあるのですが、かっこいい書き方は私が読めないため、こちらを作りました。
// ?foo=1&bar=2 を作成する
function makeParam(arr){
var param = "?"; // ?
for(var key in arr){
param += key + "=" + arr[key]; // ?key1=val1
param += "&"; // ?key1=val1&
}
param = param.replace(/&$/,""); // ?key1=val1&key2=val2& 最後の&だけいらないので消す
return param;
}
GETを投げてみる
話を短くするために、カスタムフィールドIDは既に何らかの方法で分かっているものとします。(実際には、これを取るにも1回APIをたたく必要があるかも)
やりたかったことは、タスクのカスタムフィールド(自分で追加した「案件番号」などの追加情報欄)が一定の条件を満たすタスクだけを一括取得する、というものです。
公式ドキュメントの通りに field_id, operator, value の組み合わせをパラメータで送ってやれば、特に問題はない、はずなのですが。
function get_task(){
var listId = "リストID(リストのURL末尾とかにある)";
// カスタムフィールドの値でフィルタリングができる
var customFieldsSettings = [
{
"field_id":"ここにカスタムフィールドID",
"operator":"IS NULL"
},
{
"field_id":"ここにカスタムフィールドID",
"operator":"=",
"value":"0"
}
];
const query = {
include_closed: 'true',
custom_fields: encodeURI(JSON.stringify(customFieldsSettings))
};
// 自作の makeParam()でクエリパラメータを作ってくっつける
var url = "https://api.clickup.com/api/v2/list/" + listId +"/task" + makeParam(query);
// UrlFetchAppのオプション
const options = {
"method" : "GET",
headers: {
"Content-Type": 'application/json',
"Authorization": 'ここにAPIキー'
}
};
const response = UrlFetchApp.fetch(url,options);
const jsonResponse = JSON.parse(response);
return jsonResponse;
}
不慣れなもので、エンコードで詰まって苦戦しました。
先に、 encodeURI(JSON.stringify(customFieldsSettings)) で、
値をきれいにしてから、自作関数でパラメータの体裁(?key=値)にする必要があります。
値を綺麗にするのも、JSONへの変換とURIエンコードの両方です。
この順番を間違ったり足りなかったりすると、URLやパラメータが何か違うってことでエラーを返され続けました。
エラーの原因をGeminiとかにも聞いてみたけど、 別に間違ってないんじゃない? みたいな回答をされて悲しかったです。AIはもっと人間の心に寄り添ってください。