列から文字間の行を取得し、他の列の値(選択した行のみ)を他の列に移動します。こんにちは、
下の図のように、選択した行の複数の列の値を同じテーブル内の他の列に移動またはコピーして貼り付けたい
対象となる行は常に :Item == "start" から :Item == "values" までですが、合計行数は異なる場合があります。対象となる行の Col1 と Col2 の値を Col 3 と Col 4 にコピー、貼り付け、または移動したいと考えています。現在考えているのは、:Item の下に start から values までの文字列を含むリストを手動で作成し、:Item にリストが含まれている場合は "1" というラベルを付ける列を作成することです。そこから Col 3 == Col 1、Col 4 = Col 2 を設定します。
ただし、開始と値の間の行は異なる場合があります。手動でリストを作成する必要はなく、「開始」と「値」に基づいて行を見つける、よりよい方法を誰かが知っているかどうか疑問に思います。
元のテーブル

移動後

自動化とスクリプトRe: 列から文字間の行を取得し、他の列の値(選択した行のみ)を他の列に移動する開始リストと停止リストを作成するよりも、手動で切り取りと貼り付けを行う方が簡単だと思います。
Re: 列から文字間の行を取得し、他の列の値(選択した行のみ)を他の列に移動しますただし、目的は日常的な自動化であり、開始と値の間の行は随時変更される可能性があります。
Re: 列から文字間の行を取得し、他の列の値(選択した行のみ)を他の列に移動するそれから、できるだけわかりやすくするために、次のような構成テーブルを作成します。

これにより、JSL は非常にシンプルになります。次のようになります。
Names Default To Here( 1 );
dt = Current Data Table();
dtConfig = Data Table( "Config" );
For( i = 1, i <= N Rows( dtConfig ), i++,
frCol = dtConfig:From Column[i];
toCol = dtConfig:To Column[i];
For( k = dtConfig:Start Row[i], k <= dtConfig:End Row[i], k++,
Column( dt:toCol )[k] = Column( dt, FromCol )[k];
If( dtConfig:Move_Copy == "Move",
Column( dt, FromCol ) = ""
);
);
);
Re: 列から文字間の行を取得し、他の列の値(選択した行のみ)を他の列に移動する構成テーブルがなくても安全に実行できると思います。これは、何かを上書きする前に、Col 1 の「開始」行に値が含まれていることを確認します。はい、For Each() を使用するのが好きです。
Names Default To Here( 1 );
starts = Loc( dt:Item << Get Values, "start" );
ends = Loc( dt:Item << Get Values, "values" );
For Each( {v, i}, starts,
If( :Col 1[v] != "",
For Each( {val, idx}, v :: ends[i],
:Col 3[val] = :Col 1[val];
:Col 4[val] = :Col 2[val];
:Col 1[val] = "";
:Col 2[val] = "";
)
)
);