简体   繁体   中英

.length not working on array in Google Apps Script

I have this code. I want to loop through the array and create a new doc for each entry. If I manually set the loop length to the number of rows it works fine. I want to set it to loop for the length of the array. However the .length property always returns null. What am I missing. I have also tried for each loops with no luck.

    function createDocument() 
{
  
  //var headers = Sheets.Spreadsheets.Values.get('fileID', 'A1:Z1');
  var studentHistory = Sheets.Spreadsheets.Values.get('fileID', 'A2:Z200');
  var templateId = 'fileID';
  var documentId;
  var dstFolder = DriveApp.getFolderById('folderID');
  var length = studentHistory.length;
  Logger.log(studentHistory);
  Logger.log(length);

  //Loop through rows in sheet
  for (var i = 0; i < length; i++){ 
    //Get values from sheet row
    var date = studentHistory.values[i][0];
    var studentName = studentHistory.values[i][1];
    var dob = studentHistory.values[i][2];
    var pcDoctor = studentHistory.values[i][3];
    var address = studentHistory.values[i][4];
    var fgName = studentHistory.values[i][5];
    var mgName = studentHistory.values[i][6];
    var phoneMom = studentHistory.values[i][7];
    var phoneDad = studentHistory.values[i][8];
    var empMom = studentHistory.values[i][9];
    var empDad = studentHistory.values[i][10];
    var livesWith = studentHistory.values[i][11];
    var childrenInHome = studentHistory.values[i][12];
    var childrenNotInHome = studentHistory.values[i][13];
    var othersInHome = studentHistory.values[i][14];
    var illnesses = studentHistory.values[i][15];
    var illnessDetails = studentHistory.values[i][16];
    var hospitalizations = studentHistory.values[i][17];
    var hospDetails = studentHistory.values[i][18];
    var trauma = studentHistory.values[i][19];
    var traumaDetails = studentHistory.values[i][20];
    var injuries = studentHistory.values[i][21];
    var injuryDetails = studentHistory.values[i][22];
    var medications = studentHistory.values[i][23];
    var additionalComments = studentHistory.values[i][24];
    var otherSchools = studentHistory.values[i][25];
    
    //Make a copy of the template file
    documentId = DriveApp.getFileById(templateId).makeCopy(dstFolder).getId();
    
    //Change name of newly created document
    DriveApp.getFileById(documentId).setName('SocialHistory_' + studentName + '_' + date);

    var body = DocumentApp.openById(documentId).getBody();
    
    //Insert values
    body.replaceText('<<date>>', date);
    body.replaceText('<<studentName>>', studentName);
    body.replaceText('<<dob>>', dob);
    body.replaceText('<<pcDoctor>>', pcDoctor);
    body.replaceText('<<address>>', address);
    body.replaceText('<<fgName>>', fgName);
    body.replaceText('<<mgName>>', mgName);
    body.replaceText('<<phoneMom>>', phoneMom);
    body.replaceText('<<phoneDad>>', phoneDad);
    body.replaceText('<<empMom>>', empMom);
    body.replaceText('<<empDad>>', empDad);
    body.replaceText('<<livesWithe>>', livesWith);
    body.replaceText('<<childrenInHome>>', childrenInHome);
    body.replaceText('<<childrenNotInHome>>', childrenNotInHome);
    body.replaceText('<<othersInHome>>', othersInHome);
    body.replaceText('<<illnesses>>', illnesses);
    body.replaceText('<<illnessDetails>>', illnessDetails);
    body.replaceText('<<hospitalizations>>', hospitalizations);
    body.replaceText('<<hospDetails>>', hospDetails);
    body.replaceText('<<trauma>>', trauma);
    body.replaceText('<<traumaDetails>>', traumaDetails);
    body.replaceText('<<injuries>>', injuries);
    body.replaceText('<<injuryDetails>>', injuryDetails);
    body.replaceText('<<medications>>', medications);
    body.replaceText('<<additionalComments>>', additionalComments);
    body.replaceText('<<otherSchools>>', otherSchools);

    
  }

  
}

studentHistory.values is the array.

Therefore, try this instead to get the length:

var length = studentHistory.values.length;

Solution

I see you are using Advanced Google Services to call the Sheets API. This Apps Script class allows you to call the Google APIs directly from your script handling automatically the authorization process.

However it doesn't work as the built in Classes that are available for example inside the SpreadsheetApp wrapper.

Your request will return an HTTP-like response following these specifications :

{
  "range": string,
  "majorDimension": enum (Dimension),
  "values": [
    array
  ]
}

You will need to parse these responses in order to achieve the desired result.

Proposed modification

    function createDocument() 
{
  
  //var headers = Sheets.Spreadsheets.Values.get('fileID', 'A1:Z1');
  var studentHistory = Sheets.Spreadsheets.Values.get('fileID', 'A2:Z200');
  var templateId = 'fileID';
  var documentId;
  var dstFolder = DriveApp.getFolderById('folderID');
  var length = studentHistory.values.length;

...

Reference

Google Sheets API

Advanced Google Services

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM