docs: def copy_reference_group(resource, doc, env, *args, **kwargs):
      """
      A Row generating function that copies all of the references that have the same 'Group' argument as this reference
  
      The 'RefArgs' argument is a comma seperated list of arguments from the references that will be prepended to each
      row.
  
      :param resource:
      :param doc:
      :param env:
      :param args:
      :param kwargs:
      :return:
      """
  
      all_headers = []
  
      # Combine all of the headers into a list of tuples by position
      for ref in doc.references():
          if ref.get_value('Group') == resource.get_value('Group'):
              for row in ref.iterrowproxy():
                  all_headers.append(list(row.keys()))
                  break
  
      # For each position, add the headers that are not already in the header set.
      # this merges the headers from all datasets, maintaining the order. mostly.
  
      headers = []
      for e in zip(*all_headers):
          for c in set(e):
              if c not in headers:
                  headers.append(c)
  
      if resource.get_value('RefArgs'):
          ref_args = [e.strip() for e in resource.get_value('RefArgs').strip().split(',')]
      else:
          ref_args = []
  
      yield ref_args+headers
  
      for ref in doc.references():
          if ref.get_value('Group') == resource.get_value('Group'):
              ref_args_values = [ ref.get_value(e) for e in ref_args]
  
              for row in ref.iterdict:
                  yield ref_args_values + [ row.get(c) for c in headers]