code: def insert_row(
          self,
          values,
          index=1,
          value_input_option='RAW'
      ):
          
  
          body = {
              "requests": [{
                  "insertDimension": {
                      "range": {
                        "sheetId": self.id,
                        "dimension": "ROWS",
                        "startIndex": index - 1,
                        "endIndex": index
                      }
                  }
              }]
          }
  
          self.spreadsheet.batch_update(body)
  
          range_label = '%s!%s' % (self.title, 'A%s' % index)
  
          data = self.spreadsheet.values_update(
              range_label,
              params={
                  'valueInputOption': value_input_option
              },
              body={
                  'values': [values]
              }
          )
  
          return data
docs: Adds a row to the worksheet at the specified index
          and populates it with values.
  
          Widens the worksheet if there are more values than columns.
  
          :param values: List of values for the new row.
          :param index: (optional) Offset for the newly inserted row.
          :type index: int
          :param value_input_option: (optional) Determines how input data should
                                      be interpreted. See `ValueInputOption`_ in
                                      the Sheets API.
          :type value_input_option: str
  
          .. _ValueInputOption: https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption