<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def sheetheader(sheet, startstops, usecols=None):
 """Return the channel names in a list suitable as an argument to ChannelPack's `set_channel_names` method. Return None if first two StartStops are None. This function is slightly confusing, because it shall be called with the same parameters as sheet_asdict. But knowing that, it should be convenient. sheet: xlrd.sheet.Sheet instance Ready for use. startstops: list Four StartStop objects defining the data to read. See :func:`~channelpack.pullxl.prepread`, returning such a list. usecols: str or sequence of ints or None The columns to use, 0-based. 0 is the spread sheet column "A". Can be given as a string also - 'C:E, H' for columns C, D, E and H. """


    headstart, headstop, dstart, dstop = startstops
    if headstart is None:
        return None
    assert headstop.row - headstart.row == 1, ('Field names must be in '
                                               'same row so far. Or '
                                               'this is a bug')
    header = []
    # One need to make same offsets within start and stop as in usecols:
    usecols = _sanitize_usecols(usecols)
    cols = usecols or range(dstart.col, dstop.col)
    headcols = [c + (headstart.col - dstart.col) for c in cols]

    for col in headcols:
        fieldname = sheet.cell(headstart.row, col).value
        header.append(unicode(fieldname))

    return header