2017-10-25 39 views
0

現在、別のスプレッドシートからグラブ値を取得して、それを宛先スプレッドシートに貼り付けようとしています。私が実行している問題は、このコードを実行すると不正な範囲の高さと不正確な範囲の幅が得られることです。私は2次元配列について何かを読んだが、スプレッドシートに貼り付けるために2次元配列を既に持っていると思う。あなたの時間をありがとう。範囲の高さが正しくない - Google Appsスクリプト

function GmailToDrive_StaticTest(gmailSubject, importFileID){ 


var threads = GmailApp.search('subject:' + gmailSubject + ' -label:uploaded has:attachment'); // performs Gmail query for email threads 

for (var i in threads){ 
     var messages = threads[i].getMessages(); // finds all messages of threads returned by the query 

     for (var j in messages){ 
      var attachments = messages[j].getAttachments(); // finds all attachments of found messages 
      var timestamp = messages[j].getDate(); // receives timestamp of each found message 
      var timestampMinusOne = new Date(timestamp.getTime() - (86400000)); // sets the received timestamp to exactly one day prior (# in milliseconds) 
      var date = Utilities.formatDate(timestampMinusOne, "MST", "yyyy-MM-dd"); // cleans the timestamp string 

      for (var k in attachments){ 
       var blobs = { 
         dataType: attachments[k].getContentType(), // retrives the file types of the attachments 
         data: attachments[k].copyBlob(), // creates blob files for every attachment 
         fileName: attachments[k].getName() 
         }; 

       var tempFile = DriveApp.createFile(blobs.data.setContentType('text/csv')).setName(blobs.fileName.split("-", 1).toString() + date); // creates csv files in drive's root per blob file 

       var tempFileConverted = Drive.Files.copy({}, tempFile.getId(), {convert: true}); // converts created files to gsheets 
       var importData = { 
         file: tempFileConverted, 
         ID: tempFileConverted.getId(), 
         Sheet1: SpreadsheetApp.openById(tempFileConverted.getId()).getActiveSheet(), 
         Sheet1_Values: SpreadsheetApp.openById(tempFileConverted.getId()).getActiveSheet().getDataRange().getValues() 
         }; 

       tempFile.setTrashed(true); 

       var importData_Sheet1_Rows = importData.Sheet1.getMaxRows(); - 2; 
       var importData_Sheet1_Columns = importData.Sheet1.getMaxColumns(); - 2; 
       var destSheet = SpreadsheetApp.openById(importFileID).getSheets()[0]; 

       destSheet.clearContents(); 
       Logger.log(importData.Sheet1_Values) 
       destSheet.getRange(1, 1, importData_Sheet1_Rows, importData_Sheet1_Columns).setValues(importData.Sheet1_Values); 
       DriveApp.getFileById(importData.ID).setTrashed(true);  


      } 
     } 
} 

}

答えて

2

getMaxRows()getMaxColumns()getDataRange().getValues()リターンデータを含むシートのすべての値が、シートの列と行の最大数を返します。

シート内のすべてのセルにデータがない限り、寸法は一致しません。

データアレイの実際のサイズを取得し、それを使用して宛先シートの値の範囲を設定することをお勧めします。

これは単に、このように(もっと)行く:

destSheet.getRange(1, 1, importData.Sheet1_Values.length, importData.Sheet1_Values[0].length).setValues(importData.Sheet1_Values); 

あなたは自分のスクリプトでそれを無視し、行と列のために他の値を必要としません。

+2

また、 'getDataRange'で取得した範囲に一致する' getLastRow() 'と' getLastColumn() 'を使用してください。 – FTP

+1

あなたは当然ですが、純粋な配列アプローチに焦点を当てることを好みました。なぜなら、普遍的なものだと思うからです。どのような2次元配列もこのように使用できます。とにかく私は答えにそれを含めておくべきですので、あなたが提供した追加情報をありがとう。 –

関連する問題