Question: In the following code; as per my knowledege about **useCallback hook** *'rerendering has happened!'* message should be displayed only when i am typing something inside the input field and shouldn't be printed when I am clicking on the **Toggle button**. But the message does print for the 2nd case. Why?

**my App.js file**

```
import {useState, useCallback} from 'react'
import List from './List'

function App() {
  const [a, seta] = useState('')
  const [Color, setColor] = useState("#12ab34")

  const message = useCallback(() => {
    console.log('rerendering has happened!')
    return [a+'SAMSUNG', a+'MOTO', a+'NOKIA']
  }, [a])

  return (
    <div className="App">
      <input value={a} onChange={e => seta(e.target.value)} />
      <button onClick={() => Color === "#12ab34" ? setColor("#abb111") : setColor("#12ab34") }>toggle</button>
      <List message={message()} Color={Color}/>
    </div>
  );
}

export default App;

```

**my List.js file**

```
import React from 'react'

export default function List({message, Color}){
    return (<>
    <ul>
    <li style={{color: Color}}>{message[0]}</li>
    <li style={{color: Color}}>{message[1]}</li>
    <li style={{color: Color}}>{message[2]}</li>
    </ul>
</>)
}

```

Answer: 
One way to handle a Google Sheet as a source is by creating a new table out of it in BigQuery via [Connected Sheets](https://cloud.google.com/bigquery/docs/connected-sheets).
Then, you create a new `source` in dbt that relies on that table, and start building your downstream models from there.

As far as I know, you cannot create a source directly from dbt, unless it is a `seed` file, which I woul not recommend unless it is a rather static file (e.g. country names and ISO codes, which is not prone to change over time).
We have a similar situation where the data source is from Google Sheet.

The end user updates the Google sheet on a periodical basic and we replicate it using Fivetran to our Snowflake datastore.

DBT can then pick up the data seamlessly.