文字列抽出,行始まり文字列マッチング (String, Extract Values using Line-Begin Matching)
テキストを1行毎に解析し、指定のデータ項目へ格納します。メールや定型文書の”行始まりの文字列”とマッチングします。マッチング後続の文字列を抽出します。
Configs
  • A: 解析対象の文字型(複数行)データ項目を選択してください *
  • B: 行頭のタイトルと格納用フィールド名を記載してください eg. Corporate Name:q_corp_name; *
Script (click to open)
// Configuration Format
// Format: {index}:{Questetra Data Items Field Name};
//         eg. {index$1}:{Questetra Data Items Field Name$1};{index$2}:{Questetra Data Items Field Name$2};...
//         eg. Corporate Name:q_corp_name;Person Name:q_person_name;
// index: String (the beginning of a sentence is {index}.
// Questetra Data Items Field Name: String eg. q_corp_name
// config delimiter: ":" for {index} and {Questetra Data Items Field Name}
// configs delimiter: ";" for configs
// Target Row Example : Corporate Name:Example Inc
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
  //// == 工程コンフィグの参照 / Config Retrieving ==
  const confObjA   = configs.getObject( "conf_DataIdA" );  //required
  const strConfigs = configs.get( "conf_DataIdB" );        //required
  //// == ワークフローデータの参照 / Data Retrieving ==
  const mailbody = engine.findData(confObjA);

  engine.log("mailbody:" + mailbody);
  engine.log("strConfigs:" + strConfigs);

  //// == 演算 / Calculating ==
  const configsSep = ";";
  const configSep = ":";
  const sep = ":";
  const textEndSepForMultipleRow = "---------------";

  const arrConfigs = strConfigs.split(configsSep);
  let line = new Array();
  let pos = "";
  let dat = "";
  let isParsingMultipeRow = false;
  let multipleRowText = "";
  let fieldNameForMultipleRowText = "";
  line = mailbody.split("\n");
  for(var i=0; i < line.length; i=i+1){
    pos = line[i].indexOf(sep);
    dat = line[i].slice(pos+sep.length);
    for (var j=0; j < arrConfigs.length; j++){
      let arrConfig = arrConfigs[j].split(configSep);
      if (line[i].slice(0,pos) === arrConfig[0]){
        let results = checkObjectDataType(arrConfig[1]);
        if (results[0]){ // Valid DataType
          if (results[1] === "STRING_TEXTAREA"){
            engine.log("this row is STRING_TEXTAREA: " + dat);
            isParsingMultipeRow = true;
            fieldNameForMultipleRowText = arrConfig[1];
          }else{
            setDataToItem(dat.replace(/^ /,"") , arrConfig[1] , results[1]);
          }
        }else{ // Invalid DataType
          engine.log("FileName: " + arrConfig[1] + "is not target DataType.");
        }
      }
    }
    if (isParsingMultipeRow){ // Multiple Text parsing
      if (line[i] === textEndSepForMultipleRow){
        engine.setDataByVarName(fieldNameForMultipleRowText , multipleRowText);
        isParsingMultipeRow = false;
        multipleRowText = "";
        fieldNameForMultipleRowText = "";
      }else{
        multipleRowText += dat.replace(/^ /,"") + "\n";
      }
    }
  }
} //----- End Of main()
/* checkObjectDataType(fieldName)
   Check item's field name for valid data types. Get check result and data type name.
   param: "fieldName"
   return: Array [0]: check result(boolean) [1]: item's DataType(String)
*/
function checkObjectDataType(fieldName){
  const defTypes = ["STRING_TEXTFIELD","STRING_TEXTAREA","DECIMAL","DATE_Y","DATE_YM","DATE_MD","DATE_YMD","DATETIME","SELECT_SINGLE","SELECT_CHECKBOX","QUSER"];
  let def = engine.findDataDefinitionByVarName( fieldName );
  let results = [false , ""];
  for (let i=0; i < defTypes.length; i++){
    if (def.matchDataType(defTypes[i])){
      results[0] = true;
      results[1] = defTypes[i];
    }
  }
  return results;
} //----- End Of convertObjectForTargetDataType()
/*
  setDataToItem(value,fieldName,dataType)
  Set value to data item of "fieldName".
  param1: value
  param2: fieldName: data item's field name
  param3: dataType : data item's data type name
*/
function setDataToItem(value,fieldName,dataType){
  if (value === null){ return; }
  const DATE_TYPES = ["DATE_Y","DATE_YM","DATE_MD","DATE_YMD"];
  engine.log("datatye: " + dataType);
  if (dataType === "SELECT_SINGLE"){
    engine.setDataByVarName( fieldName,[value]);
    return;
  }
  if (dataType === "SELECT_CHECKBOX"){
    const arry = value.split(",");
    engine.setDataByVarName( fieldName,arry);
    return;
  }
  if (dataType === "QUSER"){
    const quser = quserDao.findByEmail( value );
    if (quser === null){
      engine.log( fieldName + " Not Set. email" + value + " is not exist.");
    }else{
      engine.setDataByVarName( fieldName,quser);
    }
    return;
  }
  if (DATE_TYPES.indexOf(dataType) !== -1){
    const date = new Date(value);
    engine.setDataByVarName( fieldName , new java.sql.Date(date.getTime()));
    return;
  }
  if (dataType === "DATETIME"){
    const date = new Date(value);
    engine.setDataByVarName( fieldName , new java.sql.Timestamp(date.getTime()));
    return;
  }
  if (dataType === "DECIMAL"){
    if (value === null){ return; }
    engine.setDataByVarName( fieldName , new java.math.BigDecimal(value));
    return;
  }
  engine.setDataByVarName( fieldName,value);
} //----- End Of setDataToItem()

Download

2022-08-11 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/string-extract-values-using-line-begin-matching-2022/
Addonファイルのインポートは Professional でのみご利用いただけます
自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。

Notes

  • 設定項目 ”B: 行頭のタイトルと格納用フィールド名を記載してください”
    • フォーマット: {文頭検索文字列}:{フィールド名};{文頭検索文字列}:{フィールド名};…
      • ”文頭検索文字列”と”フィールド名”の区切り ”:”(半角コロン)
      • 「”文頭検索文字列”/”フィールド名”」設定区切り “;”(半角セミコロン)
    • 格納されるデータ項目の注意点
      • ユーザ型データ項目
        • データの形式:メールアドレス
      • 日付型/日時型データ項目
        • フォーマット:YYYY/MM/DD HH:mm GMT[+-][0-99]
      • 選択肢型データ項目
        • データの内容:選択肢 ID
      • 文字列型(複数行)データ項目
        • データの内容:データの最終行に”---------------”の文字列を記載
  • 解析対象のテキストの注意点
    • フォーマット: {文頭検索文字列:{格納されるデータ}
      • “文頭検索文字列”と”{格納されるデータ}”の区切り ”:”(半角コロン)

Capture

Appendix

  • 取込テキスト例
Example Text (click to open)
Hubspot よりインサイドセールス 対応フラグに適合したユーザーの情報が送信されました。

メールアドレス: taro.yamada@example.com

企業名:株式会社エグザンプル

担当者名: 山田 太郎
電話番号: 075-1234-5689
契約種別:paid

契約サービス:service1,service2

営業担当者:satoh@example2.com
契約開始日:2021/04/16 13:44 GMT+9

Webサイト訪問日時:2022/08/16 15:59 GMT+9

顧客メッセージ:業務利用範囲の拡大を検討しています。
トライアル基盤を利用して、アプリの設計を行います。
HubSpot との連携について提案をお願い致します。
---------------

コンタクトID: 12345678
ユーザスコア: 23

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。