首页 > 解决方案 > 脚本完成但没有显示任何内容

问题描述

我读了这个这个,但没有找到我的问题的答案。我有以下代码,它从表单接收 JSON 数据,并在 SpreedSheet 中插入数据:

function doPost(e) {
  // Prevent concurrent access overwritting data
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.

  // As we are passing JSON in the body, we need to unpairse it
  var jsonString = e.postData.getDataAsString();
  e.parameter = JSON.parse(jsonString);
  
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
  //  var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var doc = SpreadsheetApp.openById(FILE_Id);
    var sheet = doc.getSheetByName(SHEET_NAME);
    
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow()+1; // get next row
    var row = []; 
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
        row.push(new Date());
      } else { // else use header name to get data
        row.push(e.parameter[headers[i]]);
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    // return json success results
    return ContentService
          .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(e){
    // if error return this
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  } finally { //release lock
    lock.releaseLock();
  }
}

就向工作表添加数据而言,执行非常完美,但我在 中出现了问题return,因为我得到了以下字符串:

<!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>خطأ</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">اكتمل النص البرمجي إلا أنه لم يعرض شيئًا.</div></body></html>

阿拉伯文本的翻译是:Script completed but didn't display anything

更新

我修改了我的代码以使用如下的单个返回语句,但仍然收到相同的消息:

function handleResponse(e) {
  var result, message;
  // Prevent concurrent access overwritting data
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(1000);  // 3000 wait 30 seconds before conceding defeat.

  // As we are passing JSON in the body, we need to unpairse it
  var jsonString = e.postData.getDataAsString();
  e.parameter = JSON.parse(jsonString);
  
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
  //  var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var doc = SpreadsheetApp.openById(FILE_Id);
    var sheet = doc.getSheetByName(DATA_SHEET);
    //var report = doc.getSheetByName(REPORT_SHEET);
    
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    // var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var lastRow = sheet.getLastRow()
    var nextRow = lastRow + 1; // get next row
    var row = []; 
    if(lastRow < 10){
      RefID = "PRF.00" + lastRow
    } else {
      if(lastRow < 100){
        RefID = "PRF.0" + lastRow
      } else {
        RefID = "PRF." + lastRow
      }
    }
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Ref"){ // special case if you include a 'Timestamp' column

        row.push(RefID);
      } else { // else use header name to get data
        if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
         row.push(new Date());
        } else { // else use header name to get data
          row.push(e.parameter[headers[i]]);
       }
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    /*********************************************/

    var link = printPDF(RefID)
    console.log("PDF created")

    /*********************************************/
    // return json success results
    result = "success";
    message = link;
  } catch(e){
    // if error return this
    result = "error";
    message = e;
  } finally { //release lock
    lock.releaseLock();
  }
  return ContentService
    .createTextOutput(JSON.stringify({"result":result, "message": message}))
    .setMimeType(ContentService.MimeType.JSON);
}

标签: google-apps-scriptgoogle-sheetsweb-applications

解决方案


我发现错误如下:doPost(e)调用handleResponse(e)系统期望返回来自doPost(e)自身。

我在真实的问题中犯了一个错误,首先在我的问题的片段中(为了代码简单),我提到调用是从doPost(e)看起来误导阅读我的问题的朋友完成的。

现在我的工作代码是:

function doPost(e){
  output = handleResponse(e)
  return ContentService.createTextOutput(output)
    .setMimeType(ContentService.MimeType.JSON); 
}

function handleResponse(e) {
  var result, message;
  // Prevent concurrent access overwritting data
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(1000);  // 3000 wait 30 seconds before conceding defeat.

  // As we are passing JSON in the body, we need to unpairse it
  var jsonString = e.postData.getDataAsString();
  e.parameter = JSON.parse(jsonString);
  
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
  //  var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var doc = SpreadsheetApp.openById(FILE_Id);
    var sheet = doc.getSheetByName(DATA_SHEET);
    //var report = doc.getSheetByName(REPORT_SHEET);
    
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    // var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var lastRow = sheet.getLastRow()
    var nextRow = lastRow + 1; // get next row
    var row = []; 
    if(lastRow < 10){
      RefID = "PRF.00" + lastRow
    } else {
      if(lastRow < 100){
        RefID = "PRF.0" + lastRow
      } else {
        RefID = "PRF." + lastRow
      }
    }
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Ref"){ // special case if you include a 'Timestamp' column

        row.push(RefID);
      } else { // else use header name to get data
        if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
         row.push(new Date());
        } else { // else use header name to get data
          row.push(e.parameter[headers[i]]);
       }
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    /*********************************************/

    var link = printPDF(RefID)
    console.log("PDF created")

    /*********************************************/
    // return json success results
    result = "success";
    message = link;
  } catch(e){
    // if error return this
    result = "error";
    message = e;
  } finally { //release lock
    lock.releaseLock();
    var output = JSON.stringify({"result":result, "message": message});
  }
  return output;
}

推荐阅读