软的没边

文章 评论 浏览 27

软的没边 2025-02-14 17:57:37

您的客户端试图连接到端口 8000 时,您要公开端口 6000 。更改端口设置。

Your client tries to connect to a port 8000 while you are exposing port 6000. Change port settings.

Connection RefusedErr无法建立连接

软的没边 2025-02-14 14:37:56

You can find here tensorflow github PR

https://github.com/tensorflow/addons/pull/2635

如何通过python 3.10。

软的没边 2025-02-14 13:34:24

Wikipedia文章中的描述是错误的/误导性的。

“如果派生类实际上没有继承基类,则必须定义所有虚拟方法”仅当派生类获取 实例化 时才是正确的。单纯的声明,没有实例化,不需要定义纯虚拟方法。

Wikipedia文章的说法是“既然d不会继承b,c实际上,必须定义中的纯虚拟方法”是完全不正确的,并且以下编译没有任何问题,没有任何问题, > d 或 e 实例化纯虚拟方法:

#include <string>
#include <iostream>

class A                     {
    protected:
        std::string _msg;
    public:
        A(std::string x): _msg(x) {}
        void test(){ std::cout<<"hello from A: "<<_msg <<"\n"; }
        virtual void pure_virtual_test() = 0;
};

// since B,C inherit A virtually, the pure virtual method pure_virtual_test doesn't need to be defined
class B: virtual public A   { public: B(std::string x):A("b"){}  };
class C: virtual public A   { public: C(std::string x):A("c"){}  };

class D: public B,C {
    public:
        D(std::string x):A("d_a"),B("d_b"),C("d_c"){}
};

class E: public D {
    public:
    E(std::string x):A("e_a"),D("e_d"){}
};

int main()
{
    return 0;
}

main 是空的, d e e 没有问题就声明了。现在,如果您尝试实例化一个或另一个,那么您将遇到问题。

The description in the wikipedia article is wrong/misleading.

"If the deriving class does not inherit the base class virtually, then all virtual methods must be defined" is only true if the deriving class gets instantiated. A mere declaration, without instantiation, does not require definition of pure virtual methods.

The wikipedia article's claim that "since D does not inherit B,C virtually, the pure virtual method in A must be defined" is simply not true, and the following compiles without any issues, without either D or E instantiating the pure virtual method:

#include <string>
#include <iostream>

class A                     {
    protected:
        std::string _msg;
    public:
        A(std::string x): _msg(x) {}
        void test(){ std::cout<<"hello from A: "<<_msg <<"\n"; }
        virtual void pure_virtual_test() = 0;
};

// since B,C inherit A virtually, the pure virtual method pure_virtual_test doesn't need to be defined
class B: virtual public A   { public: B(std::string x):A("b"){}  };
class C: virtual public A   { public: C(std::string x):A("c"){}  };

class D: public B,C {
    public:
        D(std::string x):A("d_a"),B("d_b"),C("d_c"){}
};

class E: public D {
    public:
    E(std::string x):A("e_a"),D("e_d"){}
};

int main()
{
    return 0;
}

main is left empty, and D and E are declared without issues. Now, if you try to instantiate one or the other, then you're going to have problems.

&quot&quot'如果派生类实际上没有继承基类,则必须定义所有虚拟方法。“如何以正确的方式理解这一点?

软的没边 2025-02-14 03:03:14

Connect-Msgraph'不被认为是CMDLET的名称,

问题发生是由于VS代码无法访问系统中 psModulepath ,或者如果您不使用最新<代码> Microsoft.graph SDK。

尝试在默认路径中安装模块,

    Install-Module -Name Microsoft.Graph -RequiredVersion 1.2.0

请参考在此处如果在系统默认路径中包含OneDrive。

在默认路径中添加所需的模块后,尝试重新启动VS代码和系统。

参考

Connect-MsGraph' is not recognized as the name of a cmdlet,

The issue happens because of the VS code is not able to access the PSModulePath in the system or it happens if you are not using the latest Microsoft.Graph SDK.

Try to install the module in a default path

    Install-Module -Name Microsoft.Graph -RequiredVersion 1.2.0

Refer here if in your system default path contains OneDrive.

After adding the required modules in a default path try to restart the VS Code and System.

References

&quot“ connect-msgraph&#x27;不被认为是cmdlet的名称

软的没边 2025-02-14 00:36:16

country_code-&gt;具有地图 ; formatting_function_name 表示您需要另一层将函数名称转换为函数调用。您可以避免这种情况,因为在Scala函数中是一流的实体,这意味着它们可以作为参数传递到其他函数,因为功能是对象。

一个简单的解决方案是根据格式函数的类型更改 MAP 值类型参数。我的意思是:

val funcMap: Map[String, String => String]

现在您可以为您的 country_code 使用:

indf.withcolumn("mapped_id", funcMap("country_code")("mapped_id"))

快速测试:

object Something extends App {

  val Id = "someId"

  val Au = "AU"
  val Bh = "BH"
  val Cn = "CN"
  val In = "IN"

  def function001(id: String): String = s"$id function001"
  def function002(id: String): String = s"$id function002"
  def function003(id: String): String = s"$id function003"
  def function004(id: String): String = s"$id function004"

  val funcMap = Map[String, String => String](
    Au -> function001,
    Bh -> function002,
    Cn -> function003,
    In -> function004
  )

  println(funcMap(Au)(Id))
}

输出:输出:

someId function001

Having a Map from country_code -> formatting_function_name means you need another layer of converting a function name to a function call. You can avoid this because in Scala functions are first-class entities, which means they can be passed around to other functions as parameters, because functions are objects.

A straightforward solution is to change your Map value type parameter according to the type of the formatting function. Here's what I mean:

val funcMap: Map[String, String => String]

Now you can create the formatted String for your country_code using:

indf.withcolumn("mapped_id", funcMap("country_code")("mapped_id"))

Here's a quick test:

object Something extends App {

  val Id = "someId"

  val Au = "AU"
  val Bh = "BH"
  val Cn = "CN"
  val In = "IN"

  def function001(id: String): String = s"$id function001"
  def function002(id: String): String = s"$id function002"
  def function003(id: String): String = s"$id function003"
  def function004(id: String): String = s"$id function004"

  val funcMap = Map[String, String => String](
    Au -> function001,
    Bh -> function002,
    Cn -> function003,
    In -> function004
  )

  println(funcMap(Au)(Id))
}

Outputs:

someId function001

如何使用查找来了解要执行的功能?

软的没边 2025-02-13 23:43:57

要快捷操作(尤其是删除合并),您可以使用 groupy.transform ,它将保留原始索引:

df["what_i_want_2"] = (df["amount"] * df["con"]) / (
    df.groupby("name")["amount"].transform("sum")
)

To shortcut the operations (esp. remove the merge), you can use groupy.transform, which will retain the original index:

df["what_i_want_2"] = (df["amount"] * df["con"]) / (
    df.groupby("name")["amount"].transform("sum")
)

大熊猫通过计算多个列将功能应用到每一行

软的没边 2025-02-13 16:02:11

感谢Alex和Kroitor(在Github上)。

下面的代码应归功于KROOTOR(在GitHub上) https://github.com/github.com/ccxt/ccxt/问题/13806

import ccxt

# make sure your version is 1.51+
print('CCXT Version:', ccxt.__version__)

exchange = ccxt.ftx({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    # "headers": {
    #     "FTX-SUBACCOUNT": "YOUR_SUBACCOUNT"
    # }
})


markets = exchange.load_markets ()

# exchange.verbose = True  # uncomment for debugging

all_results = {}
symbol = None
since = None
limit = 200
end_time = exchange.milliseconds()

while True:
    print('------------------------------------------------------------------')
    params = {
        'end_time': int(end_time / 1000),
    }
    results = exchange.fetch_deposits(symbol, since, limit, params)
    if len(results):
        first = results[0]
        last = results[len(results) - 1]
        end_time = first['timestamp']
        print('Fetched', len(results), 'deposits from', first['datetime'], 'till', last['datetime'])
        fetched_new_results = False
        for result in results:
            if result['id'] not in all_results:
                fetched_new_results = True
                all_results[result['id']] = result
        if not fetched_new_results:
            print('Done')
            break
    else:
        print('Done')
        break


all_results = list(all_results.values())
all_results = exchange.sort_by(all_results, 'timestamp')

print('Fetched', len(all_results), 'deposits')
for i in range(0, len(all_results)):
    result = all_results[i]
    print(i, result['id'], result['currency'], result['datetime'], result['amount'])

检查正确性的最简单方法是使用

https://chain.so/api/v2/get_address_received/coin_name/your_address

示例

比较 escrenceed_received_value 与ftx返回的值

Thanks Alex and Kroitor(on Github).

Code below should credit to Kroitor (on Github) https://github.com/ccxt/ccxt/issues/13806

import ccxt

# make sure your version is 1.51+
print('CCXT Version:', ccxt.__version__)

exchange = ccxt.ftx({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    # "headers": {
    #     "FTX-SUBACCOUNT": "YOUR_SUBACCOUNT"
    # }
})


markets = exchange.load_markets ()

# exchange.verbose = True  # uncomment for debugging

all_results = {}
symbol = None
since = None
limit = 200
end_time = exchange.milliseconds()

while True:
    print('------------------------------------------------------------------')
    params = {
        'end_time': int(end_time / 1000),
    }
    results = exchange.fetch_deposits(symbol, since, limit, params)
    if len(results):
        first = results[0]
        last = results[len(results) - 1]
        end_time = first['timestamp']
        print('Fetched', len(results), 'deposits from', first['datetime'], 'till', last['datetime'])
        fetched_new_results = False
        for result in results:
            if result['id'] not in all_results:
                fetched_new_results = True
                all_results[result['id']] = result
        if not fetched_new_results:
            print('Done')
            break
    else:
        print('Done')
        break


all_results = list(all_results.values())
all_results = exchange.sort_by(all_results, 'timestamp')

print('Fetched', len(all_results), 'deposits')
for i in range(0, len(all_results)):
    result = all_results[i]
    print(i, result['id'], result['currency'], result['datetime'], result['amount'])

The easiest way to check the correctness is using

https://chain.so/api/v2/get_address_received/coin_name/your_address

Example
https://chain.so/api/v2/get_address_received/DOGE/DM7Yo7YqPtgMsGgphX9RAZFXFhu6Kd6JTT

Compare confirmed_received_value with returned value from FTX

CCXT提取存款仅显示过去的1个月数据

软的没边 2025-02-13 14:34:03

堆栈在x86上生长(由体系结构定义,pop增量堆栈指针,推动减少。)

Stack grows down on x86 (defined by the architecture, pop increments stack pointer, push decrements.)

在大多数现代系统中,堆栈增长的方向是什么?

软的没边 2025-02-13 08:20:41

更新:我也找到了一个解决方案,即使没有优化。

String convertToJson(String str) {
  str = str.toString().replaceAll('{', '{"');
  str = str.toString().replaceAll(': ', '": "');
  str = str.toString().replaceAll(', ', '", "');
  str = str.toString().replaceAll('}', '"}');
  return str;
}

Update : I found a solution even if it is not optimized.

String convertToJson(String str) {
  str = str.toString().replaceAll('{', '{"');
  str = str.toString().replaceAll(': ', '": "');
  str = str.toString().replaceAll(', ', '", "');
  str = str.toString().replaceAll('}', '"}');
  return str;
}

flutter用双打行情将字符串转换为json

软的没边 2025-02-13 07:58:15

tl; dr 您可以使用 stepverifier.withvirtualtime 来测试基于时间的操作员并避免长时间延迟。此外,由于流是无限的,因此您需要在某个时候使用 tancancel 取消订阅。

以下是一些示例

@Test
void testDelayElements() {
    StepVerifier.withVirtualTime(() ->
                Mono.just(1).repeat() // infinite Flux with backpressure
                        .delayElements(Duration.ofMillis(10000))
                        .concatMap(ignore -> doSomething())
            )
            .expectSubscription()
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .thenCancel()
            .verify();
}

以获取更多信息,请检查“ nofollow noreferrer”>操纵时间反应堆中的部分 3参考指南。

文档非常重要的一点

额外谨慎,以确保供应商&lt;出版商&gt;可以以懒惰的方式使用。否则,不能保证虚拟时间。特别是避免在测试代码早期实例化磁通,并让供应商返回该变量。相反,请始终实例化lambda内的通量。

请注意,发布者是使用供应商&lt; t&gt;&gt; 懒惰的。例如,以下内容将无法正常工作

@Test
void testDelayElements() {
    var stream = Mono.just(1).repeat() // infinite Flux with backpressure
            .delayElements(Duration.ofMillis(10000))
            .concatMap(ignore -> doSomething());
    
    StepVerifier.withVirtualTime(() -> stream)
            ....
}

TL;DR You can use StepVerifier.withVirtualTime to test time-based operators and avoid long delays. In addition, because stream is infinite, you would need to cancel subscription using thenCancel at some point.

Here are some examples

@Test
void testDelayElements() {
    StepVerifier.withVirtualTime(() ->
                Mono.just(1).repeat() // infinite Flux with backpressure
                        .delayElements(Duration.ofMillis(10000))
                        .concatMap(ignore -> doSomething())
            )
            .expectSubscription()
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .expectNoEvent(Duration.ofMillis(10000))
            .expectNextCount(1)
            .thenCancel()
            .verify();
}

For more information, check Manipulating Time section in the Reactor 3 Reference Guide.

Very important point from the documentation

Take extra care to ensure the Supplier<Publisher> can be used in a lazy fashion. Otherwise, virtual time is not guaranteed. Especially avoid instantiating the Flux earlier in the test code and having the Supplier return that variable. Instead, always instantiate the Flux inside the lambda.

Note that the publisher is created lazily using the Supplier<Publisher<T>>. For example, the following will not work as expected

@Test
void testDelayElements() {
    var stream = Mono.just(1).repeat() // infinite Flux with backpressure
            .delayElements(Duration.ofMillis(10000))
            .concatMap(ignore -> doSomething());
    
    StepVerifier.withVirtualTime(() -> stream)
            ....
}

如何编写stepverfier以测试flux.interval和延迟元素?

软的没边 2025-02-11 13:15:35

由于您在评论中说明:

我的所有用法(如上所示)将是价值类型(int,float,主要是bool)

只需使用 struct generic约束

其中t:struct - 类型参数必须是不可删除的值类型。有关无效价值类型的信息,请参见无效的值类型。因为所有值类型都有无访问的无参数构造函数,所以 struct 约束意味着 new()约束,并且不能与 new()约束。您不能将 struct 约束与 约束。

结合起来。

public class Parameter<T> where T : struct {
    public T Value { get; set;}
    public T? Min { get; set; }

    public void Set(T? value_) 
    {
    }
}

哪个将允许 t?解决到无效的值类型将制作 parameter.set(null); 有效。

Since you stated in the comments:

All of my usage (as implied above) will be value types (int, float, bool primarily)

Just use struct generic constraint:

where T : struct - The type argument must be a non-nullable value type. For information about nullable value types, see Nullable value types. Because all value types have an accessible parameterless constructor, the struct constraint implies the new() constraint and can't be combined with the new() constraint. You can't combine the struct constraint with the unmanaged constraint.

public class Parameter<T> where T : struct {
    public T Value { get; set;}
    public T? Min { get; set; }

    public void Set(T? value_) 
    {
    }
}

Which will allow T? to be resolved into nullable value type which will make parameter.Set(null); valid.

我如何在单个类中混合无效的t

软的没边 2025-02-10 13:46:04

您可以将DF1用作查找表:(

df2['Total'] = df2[df2['Class']=='A'].apply( 
      lambda x, **kwd: df1.set_index('Time').loc[kwd['tgt_time'],x['Item']]*x['Factor'],
          axis=1, tgt_time='10:00')

  Class     Item  Factor  Total
0     A   Apples       3    9.0
1     A  Peaches       2    4.0
2     A    Pears       5   25.0
3     B      NaN       4    NaN

为了使这项工作我必须将列名从桃子更改为df1中的桃子)

You could use df1 as a lookup table:

df2['Total'] = df2[df2['Class']=='A'].apply( 
      lambda x, **kwd: df1.set_index('Time').loc[kwd['tgt_time'],x['Item']]*x['Factor'],
          axis=1, tgt_time='10:00')

  Class     Item  Factor  Total
0     A   Apples       3    9.0
1     A  Peaches       2    4.0
2     A    Pears       5   25.0
3     B      NaN       4    NaN

(To make this work I had to change the column name from Peachs to Peaches in df1)

基于其他数据框的其他列创建新列

软的没边 2025-02-10 12:55:20

设置 intert属性在对话框上在打开它之前,然后将其设置为False之后。这将防止任何自动对焦行为。

my_dialog.inert = true;

my_dialog.show();

my_dialog.inert = false;

Set the inert property on the dialog to true just before opening it, then set it to false after. This will prevent any autofocus behavior.

my_dialog.inert = true;

my_dialog.show();

my_dialog.inert = false;

防止HTML对话框抓住焦点

软的没边 2025-02-10 12:00:24

使用 .mdx 扩展而不是 .md 扩展。

Use .mdx extension instead of a .md extension.

如何在NextJ中获得MDX的出口

软的没边 2025-02-10 02:46:11

调试Google Apps脚本Web应用程序在很大程度上取决于使用的Google Apps脚本功能,即使用模板HTML创建,如果客户端端与服务器端进行通信,等等。

当OP案例Case Google Apps脚本脚本执行日志中, '显示任何错误消息,很可能创建了 htmloutput ,并且应该可以在客户端上检查代码。

Google将插入iframe的iframe html/css/javaScript传递给HTMLService的IFRAME版本中的客户端A ife,即白色间距将不相同,不会在其他更改中包含评论。无论如何,您可以使用开发工具查看所得的JavaScript并从Dev Tools Console等调用JavaScript函数

。代码>在控制台下拉列表选择器上:

​请记住,在Google Apps脚本项目上进行的更改不会保存。

值得一提的是,可以使用Google Apps脚本编辑器调试纯JavaScript。更简单的方法是将JavaScript代码放在.GS文件中,然后使用HTMLTemplate创建Web应用程序的 htmlOutput 对象将与: script> script> script> scriptsapp.getResource(name).getDataAsstring().getDataAsstring()< /代码>。另外,这种方法将有助于使用桌面工具测试JavaScript代码,这将有助于更轻松地修复由于缺失 /错误的&lt;,&gt;,'',',',(,(,),(,),: 并利用.HTML文件中的JavaScript的IntelliSense

功能客户端JavaScript在 javascript.js.gs 文件中。 调用我们要调试的功能。

/**
 * Respond to HTTP GET request. Returns a htmlOutput object.
 */
function doGet(e){
  return HtmlService.createTemplateFromFile('index')
    .evaluate()
    .setTitle('My web app');
}

/**
 * Returns the file content of a .gs or .html Google Apps Script file.
 *
 * @param {filename} Google Apps Script file name. It should not include the .gs or .html file extension
 */
function include(filename){
   const [name, suffix] = filename.split('.');
   switch(suffix){
     default: 
       return HtmlService.createHtmlOutputFromFile(name).getContent();
     case 'js':
       const content = ScriptApp.getResource(name).getDataAsString(); 
       return `<script>${content}</script>`;
     }
   
}

设置了所需的参数,

<!DOCTYPE html>
<html>
  <head>
    <?!= include('stylesheet.css') ?>
  </head>
  <body>
    <p>Add here some content</p>
    <?!= include('javascript.js') ?>
  </body>
</html>

它们

/**
 * Arithmetic addition of two operands. Validates that both operands are JavaScript numbers.
 *
 * @param {number} a Left addition operand
 * @param {number} a Right addition operand
 */
function addition(a,b){
   if(typeof a !== 'number') || typeof b !== 'number') throw new Error('Operands should be numbers');
   return a + b;
}

test.gs文件上有几个“测试”

/**
 * Passing two numbers. Expected result: 2.
 */
function test_addition_01(){
  const a = 1;
  const b = 1;
  const result = addition(a,b);
  console.log(result === 2 ? 'PASS' : 'FAIL');
}

/**
 * Passing one number and one string. Expected result: Custom error message.
 */
function test_addition_02(){
  const a = 1;
  const b = '1';
  try{
    const result = addition(a,b);
  } catch(error) {
    console.log(error.message === 'Operands should be numbers' ? 'PASS' : 'FAIL');
  }
  
}

函数, getResource 即使在库中包括此方法

来调试使用其他技术的JavaScript,也 无法从库中提取文件主机或使用尝试...捕获并从服务器端拨打某些功能,Google.script.run,以记录执行日志上的错误。

要调试调用JavaScript库的JavaScript,您可以使用 urlfetchapp est (请参阅如何从外部源加载JavaScript并在Google Apps脚本中执行它

Debugging a Google Apps Script web application depends a lot on what Google Apps Script features are used, i.e. if it's created using templated HTML, if the client side communicates with the server side, etc.

As the OP case the Google Apps Script execution log doesn't show any error message, it's very likely that the HtmlOutput was created and it should be possible to inspect the code on the client-side.

Google sends to the client-side a IIFE that inserts into an iframe a satinized version of the HTML/CSS/JavaScript passed to the HtmlService, i.e. the white spacing will not be same, comments will not be included among other changes. Anyway, you might use the dev tools to see the resulting JavaScript and call JavaScript functions from dev tools console, etc.

To execute client-side JavaScript from a Google Apps Script web app, first select the userHtmlFrame(userCodeAppPanel) on the console dropdown selector:

You can even do changes to the client-side JavaScript using the dev tools Elements panel or using JavaScript in the dev tools console, and do other stuff. Just bear in mind that changes done there will not be saved on the Google Apps Script project.

It's worthy to mention that it's possible to debug pure JavaScript using the Google Apps Script editor. The easier way is to put the JavaScript code in a .gs file and use HtmlTemplate to create the HtmlOutput object of the web application together with: ScriptApp.getResource(name).getDataAsString(). Also this approach will help to test the JavaScript code using desktop tools, will help to make it easier to fix "Malformed" errors caused by missing / misplaced <,>,",',(,),:,; and take advantage of the intellisense features for JavaScript that aren't available in the .html files.

Sample of a web application having the client-side JavaScript on a .gs file instead of on a .html file. The client-side JavaScript is in the javascript.js.gs file. In this overly simplified example, the function to be tested require parameters. This makes that the function cannot be run directly from the Editor toolbar, so there is couple of "test" functions on the test.gs file that set the required parameters and call the function that we want to debug.

Code.gs

/**
 * Respond to HTTP GET request. Returns a htmlOutput object.
 */
function doGet(e){
  return HtmlService.createTemplateFromFile('index')
    .evaluate()
    .setTitle('My web app');
}

/**
 * Returns the file content of a .gs or .html Google Apps Script file.
 *
 * @param {filename} Google Apps Script file name. It should not include the .gs or .html file extension
 */
function include(filename){
   const [name, suffix] = filename.split('.');
   switch(suffix){
     default: 
       return HtmlService.createHtmlOutputFromFile(name).getContent();
     case 'js':
       const content = ScriptApp.getResource(name).getDataAsString(); 
       return `<script>${content}</script>`;
     }
   
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <?!= include('stylesheet.css') ?>
  </head>
  <body>
    <p>Add here some content</p>
    <?!= include('javascript.js') ?>
  </body>
</html>

javascript.js.gs

/**
 * Arithmetic addition of two operands. Validates that both operands are JavaScript numbers.
 *
 * @param {number} a Left addition operand
 * @param {number} a Right addition operand
 */
function addition(a,b){
   if(typeof a !== 'number') || typeof b !== 'number') throw new Error('Operands should be numbers');
   return a + b;
}

tests.gs

/**
 * Passing two numbers. Expected result: 2.
 */
function test_addition_01(){
  const a = 1;
  const b = 1;
  const result = addition(a,b);
  console.log(result === 2 ? 'PASS' : 'FAIL');
}

/**
 * Passing one number and one string. Expected result: Custom error message.
 */
function test_addition_02(){
  const a = 1;
  const b = '1';
  try{
    const result = addition(a,b);
  } catch(error) {
    console.log(error.message === 'Operands should be numbers' ? 'PASS' : 'FAIL');
  }
  
}

Note: ScriptApp.getResource can't pull files from libraries even when including this method on the library

For debugging JavaScript that makes use of other technologies, i.e. document.getElementById(id) one option is to dev tools console or using try... catch and call some function from the server side, google.script.run, for logging errors on the execution logs.

To debug a JavaScript that calls JavaSCript libraries, you might copy the libraries code into one or multiple .gs files or load it into the server side by using UrlFetchApp and eval (see How to load javascript from external source and execute it in Google Apps Script)

如何在Google脚本中的HTMLService中调试JavaScript

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

更多

友情链接

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文