メインコンテンツへスキップ
Twenty は現時点でネイティブの数式フィールドをまだサポートしていません(2026 年に提供予定)ですが、ワークフローを使えば同等の結果を実現できます。 この回避策により、単純な連結から複雑なビジネスロジックまで、フィールド値を自動計算して入力できます。

一般的な使用例

ユースケース数式例
氏名First Name + ” ” + Last Name
見込み金額Amount × Probability
期日までの日数Due Date - Today
ステージ滞在日数Today - Stage Entry Date
リードスコア複数の基準に基づくポイント
パイプラインのステージでの時間を追跡する完全な例については、商談が各ステージにとどまる時間を追跡 を参照してください。

基本の式:連結

例:氏名を自動入力

目的: 名と姓を自動的に結合して氏名フィールドにする。

セットアップ

  1. トリガー: レコードが更新または作成される(People)
  2. フィルター: 名または姓が変更されたかを確認
  3. コードアクション:
export const main = async (params) => {
  const { firstName, lastName } = params;

  const fullName = [firstName, lastName]
    .filter(Boolean)
    .join(' ');

  return { fullName };
};
  1. レコードを更新: 氏名を {{code.fullName}} に設定

数値の式:見込み金額

例:見込み収益を計算

目的: 商談金額に確度を掛けて見込み金額を算出する。 ワークフロー全体については、パイプラインで見込み金額を表示する方法 を参照してください。

クイックセットアップ

  1. トリガー: レコードが更新される(Opportunities、Amount または Probability フィールド)
  2. コードアクション:
export const main = async (params) => {
  const { amount, probability } = params;

  const expectedAmount = (amount || 0) * (probability || 0) / 100;

  return { expectedAmount };
};
  1. レコードを更新: 見込み金額を {{code.expectedAmount}} に設定

日付の式:日数計算

例:タスクの期日までの日数

目的: タスクの期日まで残り何日かを計算する。

セットアップ

  1. トリガー: レコードが更新または作成される(Tasks、Due Date フィールド)
  2. コードアクション:
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 };
};
  1. レコードを更新: 期日までの日数を {{code.daysUntilDue}} に設定
負の値は期限超過のタスクを示します。 このフィールドを使用して、緊急度でタスクをフィルターまたは並べ替えることができます。

条件付き式:リードスコア

例:条件に基づいてリードスコアを計算

目的: 企業規模、業種、エンゲージメントに基づいてリードにスコアを付与する。

セットアップ

  1. トリガー: レコードが更新される(People または Companies)
  2. コードアクション:
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 };
};
  1. レコードを更新: リードスコアを {{code.leadScore}} に設定

テキストの式:ドメイン抽出

例:メールからドメインを抽出

目的: メールのドメインを自動抽出して保存する。

セットアップ

  1. トリガー: レコードが更新される(People、Email フィールド)
  2. コードアクション:
export const main = async (params) => {
  const { email } = params;

  if (!email) return { domain: null };

  const domain = email.split('@')[1]?.toLowerCase();

  return { domain };
};
  1. レコードを更新: ドメインフィールドを {{code.domain}} に設定

ベストプラクティス

パフォーマンス

  • 関連するフィールド変更時のみトリガーする
  • 計算が不要なレコードをスキップするためにフィルターを使用する
  • 大量のワークフローでは複雑な計算を避ける

エラーハンドリング

  • 計算の前に null/undefined の値を確認する
  • データが欠落している場合はデフォルト値を使用する
  • 計算が失敗したときは明確なエラーメッセージを返す

テスト

  • エッジケース(空のフィールド、ゼロ値)でテストする
  • 有効化する前に計算を手動で検証する
  • 意図しない結果がないかワークフローの実行を監視する

関連