Twenty は現時点でネイティブの数式フィールドをまだサポートしていません(2026 年に提供予定)ですが、ワークフローを使えば同等の結果を実現できます。 この回避策により、単純な連結から複雑なビジネスロジックまで、フィールド値を自動計算して入力できます。
一般的な使用例
| ユースケース | 数式例 |
|---|
| 氏名 | First Name + ” ” + Last Name |
| 見込み金額 | Amount × Probability |
| 期日までの日数 | Due Date - Today |
| ステージ滞在日数 | Today - Stage Entry Date |
| リードスコア | 複数の基準に基づくポイント |
基本の式:連結
例:氏名を自動入力
目的: 名と姓を自動的に結合して氏名フィールドにする。
セットアップ
-
トリガー: レコードが更新または作成される(People)
-
フィルター: 名または姓が変更されたかを確認
-
コードアクション:
export const main = async (params) => {
const { firstName, lastName } = params;
const fullName = [firstName, lastName]
.filter(Boolean)
.join(' ');
return { fullName };
};
- レコードを更新: 氏名を
{{code.fullName}} に設定
数値の式:見込み金額
例:見込み収益を計算
目的: 商談金額に確度を掛けて見込み金額を算出する。
ワークフロー全体については、パイプラインで見込み金額を表示する方法 を参照してください。
クイックセットアップ
-
トリガー: レコードが更新される(Opportunities、Amount または Probability フィールド)
-
コードアクション:
export const main = async (params) => {
const { amount, probability } = params;
const expectedAmount = (amount || 0) * (probability || 0) / 100;
return { expectedAmount };
};
- レコードを更新: 見込み金額を
{{code.expectedAmount}} に設定
日付の式:日数計算
例:タスクの期日までの日数
目的: タスクの期日まで残り何日かを計算する。
セットアップ
-
トリガー: レコードが更新または作成される(Tasks、Due Date フィールド)
-
コードアクション:
export const main = async (params) => {
const { dueDate } = params;
if (!dueDate) {
return { daysUntilDue: null };
}
const due = new Date(dueDate);
const today = new Date();
const diffTime = due - today;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return { daysUntilDue: diffDays };
};
- レコードを更新: 期日までの日数を
{{code.daysUntilDue}} に設定
負の値は期限超過のタスクを示します。 このフィールドを使用して、緊急度でタスクをフィルターまたは並べ替えることができます。
条件付き式:リードスコア
例:条件に基づいてリードスコアを計算
目的: 企業規模、業種、エンゲージメントに基づいてリードにスコアを付与する。
セットアップ
-
トリガー: レコードが更新される(People または Companies)
-
コードアクション:
export const main = async (params) => {
const { companySize, industry, hasEmail, hasPhone, source } = params;
let score = 0;
// Company size scoring
if (companySize === 'Enterprise') score += 30;
else if (companySize === 'Mid-Market') score += 20;
else if (companySize === 'SMB') score += 10;
// Industry scoring
const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
if (targetIndustries.includes(industry)) score += 25;
// Contact info scoring
if (hasEmail) score += 10;
if (hasPhone) score += 15;
// Source scoring
if (source === 'Referral') score += 20;
else if (source === 'Website') score += 10;
return { leadScore: score };
};
- レコードを更新: リードスコアを
{{code.leadScore}} に設定
テキストの式:ドメイン抽出
例:メールからドメインを抽出
目的: メールのドメインを自動抽出して保存する。
セットアップ
-
トリガー: レコードが更新される(People、Email フィールド)
-
コードアクション:
export const main = async (params) => {
const { email } = params;
if (!email) return { domain: null };
const domain = email.split('@')[1]?.toLowerCase();
return { domain };
};
- レコードを更新: ドメインフィールドを
{{code.domain}} に設定
ベストプラクティス
パフォーマンス
- 関連するフィールド変更時のみトリガーする
- 計算が不要なレコードをスキップするためにフィルターを使用する
- 大量のワークフローでは複雑な計算を避ける
エラーハンドリング
- 計算の前に null/undefined の値を確認する
- データが欠落している場合はデフォルト値を使用する
- 計算が失敗したときは明確なエラーメッセージを返す
テスト
- エッジケース(空のフィールド、ゼロ値)でテストする
- 有効化する前に計算を手動で検証する
- 意図しない結果がないかワークフローの実行を監視する