0

経費報告書のチュートリアルを使用して、ほとんどのコードを生成しました。

主な変更点は、経費報告書の ID を行番号ではなく、乱数 (ll-nnnn) にしたことです。経費精算シートと経費承認シートの間の識別子としてレポート ID を使用したいので、レポートシートにレポート ID 列を追加しました。スクリプトで承認フォームからレポート ID を取得し、レポート シート ID 列でその ID を含む行を検索し、承認または拒否されたかどうか、およびマネージャーが対応する行に持っていたコメントを入力します。列 M と N です。VBA で使用するコードは、一致条件を持つ If ステートメントです。私はJavaスクリプトが初めてなので、これを行う方法がわかりません。*** fooby が提供したものを使用してコードを編集しました。実行すると、「範囲の座標または次元が無効です」というエラーが表示されます。行: " poSheet.getRange(rowToUpdate, 2, 1, 13).setValues(updateInfo);" どんな提案でも大歓迎です!

    var PO_SPREADSHEET_ID= "0At0Io3p64FeddFVCV2lJdEpLY09MYWNkVS05NDhzWkE";
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    var poSs = SpreadsheetApp.openById(PO_SPREADSHEET_ID);
    var poSheet = poSs.getSheets()[0];

    function updatePOSheet() {
    // Get IDs from Approval Sheet
    var row = sheet.getRange(2, 1, sheet.getLastRow()-1,sheet.getLastColumn()).getValues();
    // Get IDs from Report Sheet, flatten it into a 1D array
    var poId = poSheet.getRange(2,1,poSheet.getLastRow()-1,1).getValues().reduce(flatten_);
   // For each row in the Approval Sheet update the coresponding report row
   // reportIds is passed a "this" in the forEach function, see below
      row.forEach(updateReportRow_,poId);

      }

   // Checks to see if the status of a row is either "Approved" or "Denied
  // then updated the correct row in the reports sheet with manager's comments
     function updateReportRow_(row) {
     var id = row[2];
     var status = row[3];
     var comments = row[4];

  // Get row in reports sheet from reportIds (it was passed as 'this')
     var rowToUpdate = this.indexOf(id) + 1; 

  // Put info into spreadsheet friendly array
     var updateInfo = [[status,comments]];

     if (status == "Approved" || status == "Denied") {
     poSheet.getRange(rowToUpdate, 2, 1, 13).setValues(updateInfo);
       }
     }

  // Returns a piece of an array concatenated with the element on to it's right
  // will make [[0],[1],[2]...]] into [0,1,2,...]
  function flatten_(a,b) {
  return a.concat(b);
  }
4

1 に答える 1

1

私はいつもこの種のテクニックを使っていたので、ここで簡単に説明しようとしましたが、うまくいきませんでした。そこで、あなたが望むことをどのように達成できるかのデモシートをできる限りまとめました。その前に、アプローチの一般的な要点とコメントを外したコードを次に示します。

  1. onFormSubmit()トリガーの使用。
  2. 宛先シートから Ids 列を取得します。
  3. 簡単に検索できるように、結果の 2D 配列を 1D 配列にフラット化します (indexOf)
    • 私はJS反復関数reduce()と呼ばれるヘルパー関数を使用しましたflatten_(a,b)
    • 詳細についてはMDNを参照してください。
  4. イベントから入ってくる情報を整理します。
  5. 宛先シートの適切な行を更新します。

デモ シートに関する注意事項:

  • それらは編集可能です。だから、試してみてください。
  • レポート シート (目的のシート) には、ハードコードされた値がいくつかあります。OPは、私が作成していないフォームでこれを埋めています。
  • 承認フォームはスマートではありません。既存の ID を記入する必要があります。最終的には、これを非常に滑らかにするには、カスタム GUI が必要になります。
  • ここでスプレッドシートを見つけることができますレポート シート| 承認書

コメントを外したコードは次のとおりです。

function updateReportRow(approvalInfo) {
  var id = approvalInfo.namedValues.ID;
  var status = approvalInfo.namedValues.Status;
  var comments = approvalInfo.namedValues.Comments;
  var reportSheet = SpreadsheetApp.openById("SheetID").getSheetByName("Report Sheet");
  var reportIds = reportSheet.getRange(1,1,reportSheet.getLastRow(),1).getValues().reduce(flatten_);
  var rowToUpdate = reportIds.indexOf(id.toString())+1;
  if (rowToUpdate < 2) {
    // Something went wrong...email someone!
  } else {
    if (status == "Approved") {
      var updateInfo = [[status,comments,"STATE_APPROVED"]];
      reportSheet.getRange(rowToUpdate, 5, 1, updateInfo[0].length).setValues(updateInfo);
    } else if (status == "Denied") {
      var updateInfo = [[status,comments,"STATE_DENIED"]];
      reportSheet.getRange(rowToUpdate, 5, 1, updateInfo[0].length).setValues(updateInfo);
    }
  }
}

function flatten_(a,b) {
  return a.concat(b);
}
于 2012-12-27T17:17:35.870 に答える