code: def AppendData(self, data, custom_properties=None):
      
      # If the maximal depth is 0, we simply iterate over the data table
      # lines and insert them using _InnerAppendData. Otherwise, we simply
      # let the _InnerAppendData handle all the levels.
      if not self.__columns[-1]["depth"]:
        for row in data:
          self._InnerAppendData(({}, custom_properties), row, 0)
      else:
        self._InnerAppendData(({}, custom_properties), data, 0)
docs: Appends new data to the table.
  
      Data is appended in rows. Data must comply with
      the table schema passed in to __init__(). See CoerceValue() for a list
      of acceptable data types. See the class documentation for more information
      and examples of schema and data values.
  
      Args:
        data: The row to add to the table. The data must conform to the table
              description format.
        custom_properties: A dictionary of string to string, representing the
                           custom properties to add to all the rows.
  
      Raises:
        DataTableException: The data structure does not match the description.