【问题标题】:Dialogflow agent.add not working with promiseDialogflow agent.add 不使用承诺
【发布时间】:2019-12-01 13:27:57
【问题描述】:

我正在尝试从电子表格返回数据,代码运行正常,并且数据出现在日志中,但 agent.add 没有按预期工作。

我需要让对话流响应并返回我从电子表格中获得的数据。

发生的情况是,在代码的一个位置,对话流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 不起作用,即使我可以在日志中看到电子表格数据,(我在agent.add 之前尝试过使用和不使用return)看到这部分

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(){
//
  }
  
  

非常感谢您的帮助!

【问题讨论】:

  • 我无法理解myCode variable not is "XmXm"。我能问一下你期望的结果吗?顺便问一下,您要使用 Google Apps Script 还是 Node.js?
  • @Tanaike 很抱歉有任何混淆,XmXm 只是初始值,检查该值是否会被来自电子表格的新值覆盖
  • 感谢您的回复。根据您的回复,我建议将修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

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


【解决方案1】:

经过多次尝试,终于找到了答案,很简单,我想我需要在调用主函数sheetPromiseHandelerGet(detailsNum)之前添加return,然后调用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】:
    • 您想使用从电子表格检索到的myCodesheets.spreadsheets.values.get() agent.add("status code inside: " + myCode);
    • 您希望使用带有 Node.js 的 googleapis 来实现此目的。
    • 您已经能够使用 Sheets API 获取 Google 电子表格的值。

    如果我的理解是正确的,那么这个答案呢?请将此视为几个可能的答案中的一个。

    修改点:

    • sheets.spreadsheets.values.get() 与异步进程一起工作。这样,在您的脚本中,agent.add("status code inside: "+ myCode);myCode 始终是初始值(在您的情况下,它是 XmXm。)。
    • 在您的脚本中,sheets.spreadsheets.values.getnew Promise() 中运行。所以valuegetSheetPromise.then(function(value) {}) 是检索到的值。

    模式一:

    修改脚本:

    如果你想在你的脚本中使用agent.add("status code inside: "+ myCode); in 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值时,agent.add("status code inside: " + myCode)myCode是最后同一行的值,而@987654342的myCode @ 是第一个相同的行。如果你想第一个,请删除// of // break;

    【讨论】:

    • 感谢@Tanaika san 的帮助,非常感谢您的努力和帮助,解决问题是在另一部分代码中,我在下面发布答案
    • @usama sulaiman 感谢您的回复。很高兴您的问题得到解决。
    【解决方案3】:

    试试return agent.add("status code outside:"+value);我认为'+'不见了。

    【讨论】:

    • 是的,这只是一个错字,因为我在 ` ` 之间添加了它,但我将其更改为 " ",但确定它仍然无法正常工作
    • 我解决了这个问题,它在最后一个函数中缺少返回,我在下面发布了答案
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2019-09-27
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多