0

私は Google スプレッドシートのスクリプト エディターは初めてで、あまりプログラマーではありません。私はしばらく前から Google ドキュメントを使用しており、日々の活動において重要なツールになっています。私がやろうとしていることは、次のとおりです。ドキュメント全体を探します(「1」、「2」、「3」などの複数のシートを使用して、月に保持できる日数に対応します)および列 7 に特定の値が表示されている場合 (私の場合は RECEBER になります)、その行のすべてのデータを取得し、この目的のために作成されたシートに書き込みます。何が起こっているかというと、イベント onEdit を使用してこの関数をトリガーしています。一見理想的ですが、私の場合、他のスプレッドシートから大量のデータをコピーし、貼り付けコマンドが onEdit イベントをトリガーしません。その代わり、その行を他のシートにコピーするには、セルを手動で編集する必要があります。1 か月のすべての日が埋まり、変更が残っていれば、一度だけ実行することもできますが、本当にやりたいことは、コンテンツがスプレッドシートに挿入されたらすぐに実行することです。

私のコードには別の問題もあります。アクティブなシートが「1」に等しい場合にのみ if 句が完全な操作を実行するため、他のすべてのシートに合わせて調整する必要があります。とにかく、これには簡単な解決策があると思います。

ネットで見つけたコードは次のとおりです。

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "1" && r.getColumn() == 7 && r.getValue() == "RECEBER") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("money");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
  }
}

私はあなたが与えることができるすべての助けに感謝します. 前もって感謝します。

ディオゴ・スーザ

-- 12Oct更新 --

コードのロジックを変更し、patt0 が提案したように、作成したメニューからスクリプトを実行します。コードを修正しようとしましたが、一部のセクションが間違っていると思います。スクリプトは実行されますが、ターゲット シートに何も書き込まれません。

コードは次のとおりです。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "RECEBER", functionName: "RECEBER"} ];
  ss.addMenu("Scripts", menuEntries);
}

function mustBeCopied(sheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNumber = parseInt(sheetName);
  if (sheetNumber <=31 && sheetNumber >=1)
    return true;
  return false;
}

function RECEBER() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("money");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
  }
}

Mustbecopied 関数は、私が信じていることから、シートの範囲 (1 から 31) のみを適格に設定します。関数 RECEBER は、列 7 の値が条件 (RECEBER) を満たすかどうかを判断するため、すべての行情報を取得してターゲット シートに移動できます。

多分問題はアクティブなシートの問題です..私は自分の利点を生かして、選択したシートにスクリプトを適用できますか? また、両方のオプション (選択したシートに適用するか、ドキュメント全体に適用するか) があれば、毎日の作業が大幅に簡素化されます。

4

1 に答える 1

0

あなたの質問は実際には 1 つの複数の質問です。2 番目の部分のみを扱います。最初の部分にはかなりの数の側面 (要約シートを効果的に更新する方法) があり、別の質問で議論することができます。

特定のシートのデータをコピーする必要があるかどうかを判断するために、シートが 1 ~ 31 の数値であるという条件を満たしている場合にブール値を返す単純な関数を作成できます。

function mustBeCopied(sheetName) {
  var sheetNumber = parseInt(sheetName);
  if (sheetNumber <=31 && sheetNumber >=1)
    return true;
  return false;
}

「28.7」という名前のシートが条件を満たしていることに注意してください。

onEdit() スクリプトの最初の行は次のようになります。

if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER")

これがうまくいくかどうか教えてください。

--- 10月14日 ---

私が見る限り、残っている問題は、関数が onEdit を実行していたときに、範囲 (アクティブな範囲) が編集されたばかりのセルだったことです。したがって、範囲は 1 つのセルのみになります。

スクリプトを実行するには、メニューを選択する前に、コピーする各セルを強調表示する必要があります。これは、控えめに言っても面倒です。

さらに、コピーする範囲が定義されている場合は、各ページで同じですが、その範囲を毎回コピーするか、列の各行を反復処理して「RECEBER」を探し、それらの行をコピーすることができます。

さらに、すべてのシートを反復するように関数を更新して、これに似た方法を試すことができます。

var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < sheets.length; i::) {
    var s = sheets[i];
    if (mustBeCopied(s.getName()) {
        var range = s.getRange(someRow, 7, someNumOfRows);
        for (var j = 1; j <= someNumOfRows; j++) {
            if (range.getCell(j,1).getValue() == "RECEBER") {
                //YOUR COPY CODE
            }
        }
    }
} 

これがどのように機能するか教えてください。

于 2013-10-01T05:28:54.467 に答える