in gemini/use-cases/sheets-integration/Code.gs [115:188]
function query() {
projectId = getProjectId();
if (projectId == null) {
SpreadsheetApp.getUi().alert(
"A Google Cloud project must be selected using the Setup menu item.",
);
}
const numColumns = SpreadsheetApp.getActiveRange().getNumColumns();
if (numColumns != 1) {
SpreadsheetApp.getUi().alert(
"Exactly one column of prompts must be selected.",
);
return null;
}
// Populate temporary table in BigQuery with selected data from sheet
const prompts = sanitizePrompts(SpreadsheetApp.getActiveRange().getValues());
populateTable(prompts);
const query =
`SELECT * FROM ML.GENERATE_TEXT( MODEL \`${datasetId}.${modelId}\`, ` +
`(SELECT * FROM \`${projectId}.${datasetId}.${tableName}\`), ` +
`STRUCT(${getMaxOutputTokens()} AS max_output_tokens, ${getTemperature()} AS temperature));`;
console.log(`Query: ${query}`);
try {
response = runQuery(query);
} catch (error) {
console.log(error.details.message);
SpreadsheetApp.getUi().alert(error);
return null;
}
const responseMap = {};
invalidResponses = false;
for (const row of response.rows) {
returnedPrompt = row.f[2].v;
console.log(`Prompt: ${returnedPrompt}`);
jsonString = row.f[0].v;
console.log(jsonString);
const jsonData = JSON.parse(jsonString);
console.log(jsonData);
if (jsonData.candidates) {
content = jsonData.candidates[0].content;
}
// Is it missing content, e.g. due to a finish reason of 4 (RECITATION)?
var response = "";
if (!jsonData.candidates || !content) {
invalidResponses = true;
SpreadsheetApp.getUi().alert(row);
} else {
response = jsonData.candidates[0].content.parts[0].text;
}
console.log(`Response: ${response}`);
responseMap[returnedPrompt] = response;
}
if (invalidResponses) {
SpreadsheetApp.getActiveSpreadsheet().toast(
"Some prompts did not return a response. Check prompts and safety settings.",
);
}
// Responses come back in any order.
// Put these in the same order as the selected cells.
responses = [];
for (const prompt of prompts) {
responses.push(responseMap[prompt]);
}
writeResponses(responses);
}