基于推荐人名称写入指定Google Sheet异常:仅写入默认Sheet
问题原因与解决方案
核心问题根源
你代码里的关键问题是:PHP将referralSheetName放在了请求URL的查询参数中,但Google Apps Script的doPost函数里,e.parameter仅会解析POST请求体中的表单数据,不会自动读取URL上的查询参数。因此e.parameter.referralSheetName始终为undefined,代码触发默认值'Master',导致数据全部写入默认表。
解决方案1:将参数移入POST表单(推荐)
修改PHP的writeToSheet函数,把referralSheetName从URL参数转移到POST表单数据里:
function writeToSheet($ref_name) { global $MasterUrl, $dt, $tm, $quote_branch, $quote_service, $quote_fullname, $quote_vmm, $rlevel; $scriptURL = $MasterUrl; $ref_name = ucfirst(strtolower($ref_name)); $sheetName = $ref_name; $form_data = [ 'referralSheetName' => $sheetName, // 新增该行,将参数放入表单 'Date' => $dt, 'Time' => $tm, 'Branch' => $quote_branch, 'Service' => $quote_service, 'Full Name' => $quote_fullname, 'Vehicle Make & Model' => $quote_vmm, 'Referral Level' => $rlevel, 'Status' => $ref_name ]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($form_data), ], ]; // 直接使用原始MasterUrl,无需拼接查询参数 $context = stream_context_create($options); $result = file_get_contents($scriptURL, false, $context); $_SESSION['result'] = $result; var_dump($result); }
Google Apps Script代码无需修改,此时e.parameter.referralSheetName就能正确获取到目标Sheet名称。
解决方案2:在GAS中手动解析URL查询参数
如果不想修改PHP代码,可以调整Google Apps Script的doPost函数,手动解析URL上的查询参数:
function doPost (e) { var lock = LockService.getScriptLock(); lock.tryLock(10000); try { var sheetName = 'Master'; // 默认值 // 解析URL查询参数 if (e.queryString) { var params = e.queryString.split('&').reduce(function(obj, param) { var parts = param.split('='); obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); return obj; }, {}); sheetName = params.referralSheetName || 'Master'; } var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')); var sheet = doc.getSheetByName(sheetName); // 后续逻辑保持不变 var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; var nextRow = sheet.getLastRow() + 1; var newRow = headers.map(function(header) { return header === 'timestamp' ? new Date() : e.parameter[header]; }); sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]); return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })) .setMimeType(ContentService.MimeType.JSON); } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })) .setMimeType(ContentService.MimeType.JSON); } finally { lock.releaseLock(); } }
额外验证要点
- 确认PHP处理后的
$sheetName(ucfirst(strtolower($ref_name)))与Google Sheet的标签名称完全一致(包括空格、大小写格式),比如Sheet标签是"John Doe",需保证处理后的字符串匹配该格式。 - 检查Google Apps Script中
scriptProp.getProperty('key')是否正确获取到目标Spreadsheet的ID,无拼写错误。
内容的提问来源于stack exchange,提问作者Ryan Nantes Paco
相关产品推荐
相关产品推荐

