我正在尝试从电子表格返回数据,该代码运行正常,并且数据出现在日志中,但是agent.add
不能正常工作。
我需要使dialogflow响应并返回从电子表格中获取的数据。
发生的事情是,在代码的一个位置上,dialogflow agent.add
正常工作,但是没有返回我从电子表格中获取的数据,请参阅以下部分:
agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not showing the data which returned from spreadsheet, it only shows the original value "XmXm"
在代码的其他位置,agent.add
不起作用,即使我可以在日志中看到电子表格数据,(我在return
之前尝试使用和不使用agent.add
)也看到了这一点部分
return agent.add("status code outside:"+ value); // function agent.add whether or not I add return before it
请注意,我尝试了许多stackoverflow提供的解决方案,但仍然无法解决,下面是我的完整代码:
function sheetPromiseHandelerGet(orderNum){
const jwtClient = authSheet();
let getSheetPromise = new Promise((resolve, reject) => {
const mySpreadSheetId = 'SHEET_ID';
const sheetName = "SHEET_NAME";
let myCode = "XmXm"; // give myCode a string value for testing
let testFirst = 0;
sheets.spreadsheets.values.get(
{
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
},
(err, res) => {
if (err) {
console.error(err);
return;
}
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
}
}
);
agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not is "XmXm"
});
return getSheetPromise.then(function(value) {
console.log(value); // the value (which is the result comes from spreadsheet) appears correctly in the debugger,
return agent.add("status code outside:" value); // function agent.add whether or not I add return before it
});
}
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum);
}
function authSheet(){
//
}
我将非常感谢您的帮助!
答案 0 :(得分:1)
myCode
和sheets.spreadsheets.values.get()
处的agent.add("status code inside: " + myCode);
。如果我的理解正确,那么这个答案如何?请仅考虑以下几种可能的答案。
sheets.spreadsheets.values.get()
用于异步过程。这样,在您的脚本中,myCode
中的agent.add("status code inside: "+ myCode);
始终是初始值(在您的情况下为XmXm
。)sheets.spreadsheets.values.get
在new Promise()
中运行。因此,value
中的getSheetPromise.then(function(value) {})
是检索到的值。如果您想在脚本的agent.add("status code inside: "+ myCode);
中使用new Promise
,那么如何进行以下修改?
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
至:
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
agent.add("status code inside: "+ myCode);
resolve(myCode);
}
与其他模式一样,以下修改如何?在这种情况下,请按如下所示修改脚本中的getSheetPromise
。
let getSheetPromise = new Promise(async (resolve, reject) => {
const mySpreadSheetId = "SHEET_ID";
const sheetName = "SHEET_NAME";
let myCode = "XmXm";
// let testFirst = 0; // It seems that this is not used.
const res = await sheets.spreadsheets.values.get({
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
});
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]) {
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
// break; // When there are several same values of `orderNum` in the column "A", please use this line.
}
}
agent.add("status code inside: " + myCode);
});
orderNum
的多个相同值时,myCode
的{{1}}是最后同一行的值,而agent.add("status code inside: " + myCode)
中的myCode
是第一行。如果您想成为第一名,请从resolve(myCode)
中删除//
。答案 1 :(得分:1)
最后,经过多次尝试,我找到了答案,这很简单,我认为我需要在调用主函数return
并调用sheetPromiseHandelerGet(detailsNum)
之前添加sheetPromiseHandelerGet(orderNum)
,这就是全部
因此,如果您希望在问题中结束代码,而不是
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum); //return is missing
}
必须为
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
return sheetPromiseHandelerGet(detailsNum); //return has been added
}
除此之外,最好进行其他更改:
resolve(myCode);
成为
resolve(agent.add(myCode));
我希望可以帮助任何遇到相同问题的人
答案 2 :(得分:0)
尝试return agent.add("status code outside:"+value);
我认为缺少'+'。