Get_order_manually.gs
@vinay-google がすでに取り組んでいます。
2026年2月12日 から。
評価
この issue はまだ評価されていません。
説明
const WEBHOOK_NAME = "orders"; // اسم Sheet
const WC_SITE_URL = "https://acctopix.com"; // رابط المتجر
function fetchOrdersManually() {
const scriptProperties = PropertiesService.getScriptProperties();
const WC_CONSUMER_KEY = scriptProperties.getProperty("acctopix_CONSUMER_KEY");
const WC_CONSUMER_SECRET = scriptProperties.getProperty("acctopix_CONSUMER_SECRET");
if (!WC_CONSUMER_KEY || !WC_CONSUMER_SECRET) {
Logger.log("❌ API keys are missing in Script Properties");
return;
}
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(WEBHOOK_NAME);
if (!sheet) {
Logger.log("❌ Sheet not found: " + WEBHOOK_NAME);
return;
}
// Headers بالترتيب المطلوب + CRM_ID
const headers = [
"CRM_ID",
"ID","Store Name","ip_address","source","info device",
"Date Created","date modified","Billing Name","Billing Email","Billing Phone",
"Device Streaming","Adult Content","Package","Total","Currency",
"Products","mac mag box","app","mac adress APP","KEY APP",
"servar","user panel","M3U LINK","user","pass",
"server","Subscription date","expiration date","note","bank account name",
"Status"
];
// إضافة Headers إذا لم تكن موجودة
if (sheet.getLastRow() === 0) {
sheet.appendRow(headers);
}
// 🔽 جلب كل الطلبات من WooCommerce عبر الصفحات
let page = 1;
let allOrders = [];
while (true) {
const url = ${WC_SITE_URL}/wp-json/wc/v3/orders?per_page=50&page=${page}&consumer_key=${WC_CONSUMER_KEY}&consumer_secret=${WC_CONSUMER_SECRET};
const response = UrlFetchApp.fetch(url);
const orders = JSON.parse(response.getContentText());
if (orders.length === 0) break;
allOrders = allOrders.concat(orders);
page++;
}
// 🔽 جلب IDs الموجودة مسبقًا في العمود 2 (ID المتجر)
let existingIds = [];
if (sheet.getLastRow() > 1) {
existingIds = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1)
.getValues()
.flat();
}
// 🔽 فلترة الطلبات الجديدة فقط
let newOrders = allOrders.filter(order => !existingIds.includes(order.id));
if (newOrders.length === 0) {
Logger.log("ℹ No new orders to add.");
return;
}
// 🔽 ترتيب الطلبات الجديدة من الأقدم للأحدث حسب Date Created
newOrders.sort((a, b) => new Date(a.date_created) - new Date(b.date_created));
let newRows = [];
newOrders.forEach(order => {
const crmId = generateCRMID(); // توليد CRM_ID داخلي
const billing = order.billing || {};
const meta = order.meta_data || [];
let device_streaming="", adult_content="", select_package="", source="";
meta.forEach(m=>{
const value = m.value || "";
switch(m.key){
case "device_streaming": device_streaming = value; break;
case "adult_content": adult_content = value; break;
case "select_package": select_package = value; break;
case "_wc_order_attribution_utm_source": source = value; break;
}
});
const product_names = order.line_items ? order.line_items.map(i=>i.name).join(", ") : "";
let storeName = "";
try { storeName = extractDomainFromUrl(order._links.self[0].href); } catch(e){}
newRows.push([
crmId,
order.id,
storeName,
order.customer_ip_address || "",
source,
order.customer_user_agent || "",
order.date_created ? new Date(order.date_created) : "",
order.date_modified ? new Date(order.date_modified) : "",
`${billing.first_name || ""} ${billing.last_name || ""}`,
billing.email || "",
billing.phone || "",
device_streaming,
adult_content,
select_package,
order.total || "",
order.currency || "",
product_names,
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "",
order.status || ""
]);
});
// 🔽 إدخال الطلبات الجديدة دفعة واحدة في أول سطر فارغ
sheet.getRange(sheet.getLastRow() + 1, 1, newRows.length, newRows[0].length)
.setValues(newRows);
Logger.log(✅ ${newRows.length} new orders added.);
}
// 🔹 دالة توليد CRM_ID داخلي
function generateCRMID() {
const props = PropertiesService.getScriptProperties();
let lastId = parseInt(props.getProperty("LAST_CRM_ID") || "0", 10);
lastId++;
props.setProperty("LAST_CRM_ID", lastId.toString());
return "CRM-" + Utilities.formatString("%06d", lastId);
}
// 🔹 دالة استخراج اسم المتجر من URL
function extractDomainFromUrl(url) {
try {
return url.replace(/^https?:///, "").split("/")[0];
} catch(e){
return "";
}
}
- 主要言語
- JavaScript
- スター
- 5.2k
- フォーク
- 2k
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
googleworkspace/apps-script-samples のほかの issue
-
Alvin Litana Mirasolオープン
難易度 5/5 1週間以上 初心者へのやさしさ 1/100
googleworkspace/apps-script-samples#659 · コメント 1 件 · リアクション 1 件 ·
-
Password resetオープン
難易度 5/5 1週間以上 初心者へのやさしさ 15/100
googleworkspace/apps-script-samples#654 · リアクション 2 件 ·
-
cod gsオープン
難易度 5/5 1週間以上 初心者へのやさしさ 10/100
googleworkspace/apps-script-samples#651 · リアクション 1 件 ·
-
tespogromeオープン
難易度 5/5 1週間以上 初心者へのやさしさ 1/100
googleworkspace/apps-script-samples#624 · リアクション 1 件 ·
-
IPTV_CRM再び着手できるかも @PierrickVoulet が 229 日前に担当しましたが、オープン中のプルリクエストはありません。 オープン
googleworkspace/apps-script-samples#615 · コメント 1 件 · 担当者 1 名 ·
googleworkspace/apps-script-samples の issue をすべて見る
似ている issue
-
[Bug] @deck.gl/arcgis dist import resolves to unpublished @deck.gl/core source path (9.3.11, 9.4.0)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
stac-utils/stac-fields#42 ·
-
[sec-check] SVG remote-reference gate misses src attributes, link hrefs and bare-string @importオープンagent/security hive/hosted-available-lke648397-260827-5n31 security
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
メンテナーはふだん 1 日以内に返信
-
channels:add check:passed
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
メンテナーはふだん 2 日以内に返信