Dialogflow agent.add无法使用诺言

时间:2019-12-01 13:27:57

标签: node.js google-apps-script google-sheets dialogflow

我正在尝试从电子表格返回数据,该代码运行正常,并且数据出现在日志中,但是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(){
//
  }
  
  

我将非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

  • 您要使用从电子表格检索的myCodesheets.spreadsheets.values.get()处的agent.add("status code inside: " + myCode);
  • 您要使用带有Node.js的googleapis实现此目的。
  • 您已经能够通过Sheets API获取Google Spreadsheet的值。

如果我的理解正确,那么这个答案如何?请仅考虑以下几种可能的答案。

修改点:

  • sheets.spreadsheets.values.get()用于异步过程。这样,在您的脚本中,myCode中的agent.add("status code inside: "+ myCode);始终是初始值(在您的情况下为XmXm。)
  • 在您的脚本中,sheets.spreadsheets.values.getnew Promise()中运行。因此,value中的getSheetPromise.then(function(value) {})是检索到的值。

模式1:

修改后的脚本:

如果您想在脚本的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);
}

模式2:

修改后的脚本:

与其他模式一样,以下修改如何?在这种情况下,请按如下所示修改脚本中的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);
});
  • 例如,在这种情况下,当“ A”列中有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);我认为缺少'+'。