问题描述
我正在尝试传递Woocommerce订单上重力形式提交的信息,以便在使用Zapier的另一个应用程序中使用。我需要对表单条目信息进行拆分,以使信息不会全部位于一行上,并且可以单独访问。
由于我对JavaScript还是很陌生,所以我一直在努力几个小时才能使其工作……我正在使用的代码来自woocommerce文档。问题在于,如果所述信息继续到新行,则可以截断大量信息。请查看下面的拆分结果,并参考问题2 以了解我在说什么。
代码:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="myTextarea" cols="50" rows="4" placeholder="Enter text"></textarea>
<br>
<button onclick="getText()">
Split
</button>
表单提交示例如下:
// Define "MetaData" in the Input Data section. Ignore the "No Data" label.
// Reformat Resource Meta Data to generate keyvalue pairs.
// In case of multiple equal keys,only the last value available.
const buffer = {};
const MetaData = inputData.MetaData.split(/\n+/);
MetaData.forEach((dataString,index) => {
if (dataString.includes('id:')) {
const key = MetaData[index + 1].replace('key:','').trim();
const value = MetaData[index + 2].replace('value:','').trim();
buffer[key] = value;
}
});
return buffer;
拆分结果如下:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,this is my second question..
regards,john doe
Question 3: This is my third question
如您所见,问题2基本上消失了。我一直无法找到一种使此工作正常进行的方法。我希望有人能够在这里帮我一个忙...
编辑: __________________
按要求进行RAW:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,Question 3: This is my third question
预期的结果:
id: 419*** key: _gravity_forms_history value: {'_gravity_form_cart_item_key': '************************************','_gravity_form_linked_entry_id': ****,'_gravity_form_lead': {'2': 'This is my first question','6': 'john.doe@gmail.com','7': '2020-08-01','8': 'hi there,\r\nthis is my second question..\r\n\r\nregards,john doe','9': 'This is my third question','11': 0,'12': this is a random form entry','form_id': '3','source_url': 'https://***************************/','ip': ***************','5.2': '','5.3': 'John','5.4': '','5.6': 'Doe','5.8': '','10.1': 'Product Name','10.2': '$0.00','10.3': '1'},'_gravity_form_data': {'id': '3','bulk_id': 0,'display_title': False,'display_description': False,'disable_woocommerce_price': 'no','price_before': '','price_after': '','disable_calculations': 'yes','disable_label_subtotal': 'yes','disable_label_options': 'yes','disable_label_total': 'yes','disable_anchor': 'no','label_subtotal': 'Subtotal','label_options': 'Options','label_total': 'Total','use_ajax': 'no','enable_cart_edit': 'no','enable_cart_edit_remove': 'yes','keep_cart_entries': 'no','send_notifications': 'no','enable_cart_quantity_management': 'no','cart_quantity_field': '','update_payment_details': 'no','display_totals_location': 'after','structured_data_override': 'no','structured_data_low_price': '','structured_data_high_price': '','structured_data_override_type': 'append'}}
id: 419***
key: Name
value: John Doe
id: 419***
key: Email
value: john.doe@gmail.com
id: 419***
key: Date of Birth
value: 01.08.2020
id: 419***
key: Question 1
value: This is my first question
id: 419***
key: Question 2
value: hi there,this is my second question..
regards,john doe
id: 419***
key: Question 3
value: This is my third question
id: 419***
key: Final Entry (Optional)
value: this is a random form entry
当前请求的结果:
Name: John Doe
Email: john.doe@gmail.com
Date of Birth: 01.08.2020
Question 1: This is my first question
Question 2 :Hi There,This Is My Second Question..
Regards,John Doe
Question 3: This is my third question
Final Entry: this is a random form entry
id: ******************************
runtime_Meta:
memory_used_mb: 72
duration_ms: 100
logs:
async: false
解决方法
拆分结果如下:
Name: John Last Name: Doe Email: john.doe@gmail.com Question 1: this is my first question Question 2: hi there,Question 3: This is my third question
不,不,不,不,不。这就是您认为的结果。您的代码中有错误,并且您选择相信split
函数而不是代码是错误的。
在您的forEach
循环中,添加一行,例如
console.log('XXXX',dataString);
紧邻if (dataString.includes('id:')) {
行上方。您会看到输入的每一行都以XXXX
前缀注销,包括您声称丢失的每一行。
那么为什么 您的代码没有执行您想要的操作?好,让我们看一下forEach
调用的函数的内容:
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:','').trim();
const value = metaData[index + 2].replace('value:','').trim();
buffer[key] = value;
}
它是做什么的?如果文件的一行包含id:
,请从下一行及其后的行中获取键和值。如果文件行中不包含id:
,请不要对其进行任何操作。
在您的情况下,问题2包含多行,如我们所见,您的代码完全忽略了这一行。
如果您想要读取的所有行(包括但不包括带有id:
的下一行,而不是仅读取值中的下一行),请尝试以下操作:
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:','').trim();
let value = metaData[index + 2].replace('value:','').trim();
let index2 = index + 3;
while (index2 < metaData.length && !metaData[index2].includes('id:')) {
value += "\n" + metaData[index2].trim();
index2 += 1;
}
buffer[key] = value.trim();
}
,
您可以使用正则表达式分隔条目,然后将结果简化为键值对
import win32gui
the_window_hwnd = win32gui.GetForegroundWindow() # hwnd of the specific window,it could be whatever you what
left_top_x,left_top_y,*useless_position = win32gui.GetWindowRect(the_window_hwnd) # get the position of window you gave.
mouse_pos_x,mouse_pos_y = win32gui.GetCursorPos()
pos_in_window_x,pos_in_window_y = (mouse_pos_x - left_top_x),(mouse_pos_y - left_top_y)
print(pos_in_window_x,pos_in_window_y)