2

Google Docs for Spreadsheets (app-script) で、あるスプレッドシートから別のスプレッドシートにレコードを転送するために作成したコード スニペットがあります。

function myFunction() {
    // Get Spreadsheets
    var source = SpreadsheetApp.openById("spreadsheetKeySource");
    var target = SpreadsheetApp.openById("spreadsheetKeyTarget");

    // Set Sheets
    var source_sheet = source.getSheetByName("Sheet1");
    var target_sheet = target.getSheetByName("Sheet1");

    // Get target last row
    var last_row = target_sheet.getLastRow();

    // Set Ranges
    var source_range = source_sheet.getRange("A1:B1");
    var target_range = target_sheet.getRange("A"+(last_row+1)+":B"+(last_row+1));

    // Fetch values
    var values = source_range.getValues();

    // Save to spreadsheet
    target_range.setValues(values);
}

ソースからコンテンツを取得してループし、ターゲットに存在しないレコードのみを追加できるかどうかを知る必要があります。明らかに、この機能はこの目的には不十分であり、誰かが私を正しい方向に押し進めるか、例としてコード スニペットを提供してくれることを願っています。これまでのところ、Googleやここで役立つものは何も見つかりません... :(

助けてくれてありがとう

編集

これで完成できました。スコープが変更され、複数のシートを含む複数のスプレッドシートからデータを取得して、メールのみを取得し、それらをマスター メール スプレッドシートに追加する必要がありました。これが私が作成したコードです。他の人にも役立つことを願っています。

masterSpreadsheet を開いたときに実際にこのスクリプトを実行し、このスクリプトを実行するためのメニュー ボタンを追加しました。

/**
* Updates the master spreadsheet with the set source spreadsheets and pages
**/
function updateMasterSpreadsheet() {
  //  var sourceSpreadsheetsArray = new Array();
  var sourceSpreadsheetsObject = new Object;

  // Add Spreadsheet IDs and sheet names that need to be copied from
  sourceSpreadsheetsObject['sourceSpreadsheet1Key'] = new Array("Sheet1");
  sourceSpreadsheetsObject['sourceSpreadsheet2Key'] = new Array("Sheet1");

  // Open master spreadsheet
  var target = SpreadsheetApp.openById("masterSpreadsheetKey");

  // Open master sheet
  var target_sheet = target.getSheetByName("Sheet1");

  // Loop through all source spreadsheets
  for (var id in sourceSpreadsheetsObject) {
    // Open source spreadsheet
    var source = SpreadsheetApp.openById(id);

    // Loop through and process each sheet
    for (var sheetID in sourceSpreadsheetsObject[id]) {
      // Open source spreadsheet sheet
      var source_sheet = source.getSheetByName(sourceSpreadsheetsObject[id][sheetID]);

      // Process sheet
      _updateMasterSpreadsheet(source_sheet, target_sheet);
    } // END - source sheets loop 

  } // END - source spreadsheets loop

  // Add last updated
  target_sheet.getRange("B1").setValue(new Date());
}

/**
* Performs the actual copy into the master spreadsheet
**/
function _updateMasterSpreadsheet(source_sheet, target_sheet) {
  // Get target last row
  var last_row = target_sheet.getLastRow();  

  // Get Source Range
  var source_range = source_sheet.getDataRange();

  // Fetch Source Values
  var source_data = source_range.getValues();  

  //Iterate over all cells, looking for non-empty ("") cells
  for (var row in source_data) {

    // check if empty
    if (source_data[row][0]!= "") {
      // Fetch data in the sheet (do this in the loop to ensure that we check all newly added items)
      var target_range = target_sheet.getDataRange();
      var target_data = target_range.getValues();  

      // Set flags
      var found = false;
      var stop = false;

      // Process loop
      while(found == false && stop == false) {
        // Check for duplicates
        for (var tmpRow in target_data) {
          if (source_data[row][0] == target_data[tmpRow][0]) {
            found = true;
            break;
          }
        }

        // If no duplicate, add to sheet
        if (!found) {
          last_row++;
          target_sheet.getRange("A"+last_row).setValue(source_data[row][0]);
        }

        // Prevent infinite loop
        stop = true;
      }
    }
  }
}
4

2 に答える 2

1

Google Apps Scriptドキュメントのこのチュートリアルは、次のことに役立ちます。

チュートリアル:スプレッドシートの重複行を削除する

AppsScriptGalleryには「重複を削除」という名前のスクリプトもあります

于 2012-05-24T11:29:39.020 に答える
0

私たちのより経験豊富な人々の 1 人 (十分な人数) は、別の見方をしているかもしれませんが、2 つの行を 1 行ずつ比較する必要があると思います。どちらのシートでもコンテンツが手動で変更されていない場合にのみ機能します。

何をしようとしているのですか?ユースケースを説明していただければ、他の考えを提供できるかもしれません...

于 2012-05-23T20:25:43.010 に答える