回答編集履歴

11

  

2022/11/15 15:30

投稿

退会済みユーザー
test CHANGED
@@ -58,7 +58,7 @@
58
58
  仮に、すでにシートに書き込み済みの条文が100行あり、101行目から書き込みを再開するとした場合、rows.length は100になります。
59
59
  この状態で動かすと、再開時の同じ条文を100回シートに追記してから、次の条文に移る・・・という動作を繰り返すことになってしまいます。
60
60
 
61
- ④ そもそも、どの条文まで読み込んだか?を記録する処理がない。
61
+ ④ そもそも、XMLのどの部分まで読み込んだか?を記録する処理がない。
62
62
  100歩譲って、上記①~③を直したとしても、うまく動きません。
63
63
  なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する部分はありますが、「元のXMLデータをどこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
64
64
 
@@ -68,10 +68,11 @@
68
68
 
69
69
  このような処理の場合、読み込み元データには「スプレッドシートの行数」という概念がなく、書き込み行数と1対1対応していないため、書き込み済みデータに対応する「読み込み済み」の地点は行数で表現できず、別の切り口で記録する必要があります。
70
70
 
71
- では、どのようなものを使うかですが、ここでは「条文数」が適切でしょう。
71
+ では、どのようなものを使うかですが、ここでは「条文数」が適切でしょう。(1つの条文を書き込むのに数分かかることは通常考えられないため)
72
72
  つまり、
73
+ + 1条書き込みが完了するごとに、実行開始から5分以上経過したかを確認する。
73
- + 中断時に「第何条まで読み込んだ(=書き込んだ)か?」というデータをプロパティサービスに記録しておく
74
+ + 5分以上経過していたら中断「第何条まで読み込んだ(=書き込んだ)か?」というデータをプロパティサービスに記録しておく
74
- + 再開時は、プロパティサービスから読み込み済みの条文数を取得し、法律の第一条からその条文まで読み込む処理を再度行う。すでに読み込み済みの条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始する
75
+ + 再開する時は、プロパティサービスから読み込み済みの条文数を取得し、法律の第一条からその条文まで1条ずつ読み込む処理を再度行う。すでに読み込み済み(シートに転記済み)の条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始する
75
76
  + 転記先シートの書き込み開始行については getLastRowで取得すればよいので、プロパティに記録する必要はない
76
77
  というようにすればよいでしょう。
77
78
  (質問文記載のコードだと、一番時間のかかる処理は「書き込み」であるため)

10

 

2022/11/15 15:28

投稿

退会済みユーザー
test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  ④ そもそも、どの条文まで読み込んだか?を記録する処理がない。
62
62
  100歩譲って、上記①~③を直したとしても、うまく動きません。
63
- なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する形になっていますが、「元のXMLデータをどこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
63
+ なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する部分ありますが、「元のXMLデータをどこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
64
64
 
65
65
  元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、書き込み済みの行数だけ記録すればOKです。
66
66
 

9

 

2022/11/15 15:26

投稿

退会済みユーザー
test CHANGED
@@ -69,8 +69,11 @@
69
69
  このような処理の場合、読み込み元データには「スプレッドシートの行数」という概念がなく、書き込み行数と1対1対応していないため、書き込み済みデータに対応する「読み込み済み」の地点は行数で表現できず、別の切り口で記録する必要があります。
70
70
 
71
71
  では、どのようなものを使うかですが、ここでは「条文数」が適切でしょう。
72
+ つまり、
72
- つまり、中断時に「どのまで読み込んだか?」というデータをプロパティに記録しておきます。
73
+ + 中断時に「第何条まで読み込んだ(=書き込んだ)か?」というデータをプロパティサービスに記録してお
73
- 再開時は、法律の第一条から条文を読み込む処理を再度行い、すでに読み込み済みの条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始するようにすればよいでしょう。
74
+ + 再開時は、プロパティサービスから読み込み済みの条文数を取得し、法律の第一条からその条文までを読み込む処理を再度行う。すでに読み込み済みの条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始する
75
+ + 転記先シートの書き込み開始行については getLastRowで取得すればよいので、プロパティに記録する必要はない
76
+ というようにすればよいでしょう。
74
77
  (質問文記載のコードだと、一番時間のかかる処理は「書き込み」であるため)
75
78
 
76
79
  ---

8

 

2022/11/15 15:23

投稿

退会済みユーザー
test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  ④ そもそも、どの条文まで読み込んだか?を記録する処理がない。
62
62
  100歩譲って、上記①~③を直したとしても、うまく動きません。
63
- なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する形にはなっていますが、「どこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
63
+ なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する形にはなっていますが、「元のXMLデータをどこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
64
64
 
65
65
  元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、書き込み済みの行数だけ記録すればOKです。
66
66
 

7

 

2022/11/15 15:21

投稿

退会済みユーザー
test CHANGED
@@ -60,9 +60,9 @@
60
60
 
61
61
  ④ そもそも、どの条文まで読み込んだか?を記録する処理がない。
62
62
  100歩譲って、上記①~③を直したとしても、うまく動きません。
63
- なぜなら、質問文のコードには、「どまで書き込んだか」をプロパティに記録することでき、「どこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
63
+ なぜなら、質問文のコードには、元記事と同じく「どの**行数**まで書き込んだか」をプロパティに記録する形になっいますが、「どこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
64
64
 
65
- 元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、行数だけ記録すればOKです(書き込み済みの行数だけプロパティに記録すれば足る、ということです
65
+ 元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、書き込み済みの行数だけ記録すればOKです
66
66
 
67
67
  一方、質問者さんがやろうとしているのは、XMLの複雑な条文を読み込み、加工してスプレッドシートに記録する、という処理です。
68
68
 

6

 

2022/11/15 15:13

投稿

退会済みユーザー
test CHANGED
@@ -76,4 +76,4 @@
76
76
  ---
77
77
 
78
78
  現状だと、そこそこ大幅な修正が必要と思います。
79
- 時間があればコードを載せますが、現状忙しいため、上記ヒントにとどめます。
79
+ 時間があればコードを考えますが、現状忙しいため、上記ヒントにとどめます。

5

 

2022/11/15 15:12

投稿

退会済みユーザー
test CHANGED
@@ -43,10 +43,10 @@
43
43
  ```
44
44
  としても、 rows.length が 0または1ならば 1>0または1==1ですから、ループは開始しません。
45
45
 
46
- 元記事「Google Apps Script で6分以上の処理をする」は実際不親切な記事で質問者さんにはあまり参考にならないと思います。(この記事では「どのような処理について、具体的にどう実装すれば継続できるのか」ということが書かれていません)
46
+ 元記事「Google Apps Script で6分以上の処理をする」は実際不親切な記事で質問者さんにはあまり参考にならないと思います。(この記事では「/* ここでメイン処理 */」の1行だけしか書かれておらず、「どのような処理について、具体的にどう実装すれば継続できるのか」ということが書かれていません
47
- このため、質問者さんも、よく考えずに適当に追加した挙句「動かない」と困っているのではないでしょうか。
47
+ このため、質問者さんも、よく理解できずに適当に追加した挙句「動かない」と困っているのではないでしょうか。
48
48
 
49
- 元記事が元にしているコードは **「あるシート内のデータを1行目から、別のシートに1行ずつコピーする」** という処理を想定したものす。
49
+ 元記事がおそらく元にしているであろうコードは **「あるシート内のデータを1行目から、別のシートに1行ずつコピーする」** という処理を想定したものと考えられます。
50
50
  つまり記事のコード中の sheet は**コピー元のシート**を意味しています。
51
51
  一方質問者さんのコードでは、sheet は**抽出した条文の転記先シート**なのですから、全く役割が異なりますよね?
52
52
   

4

 

2022/11/15 15:09

投稿

退会済みユーザー
test CHANGED
@@ -57,7 +57,6 @@
57
57
  この、ループ開始の forを articles.forEach の後に入れているのも間違いです。
58
58
  仮に、すでにシートに書き込み済みの条文が100行あり、101行目から書き込みを再開するとした場合、rows.length は100になります。
59
59
  この状態で動かすと、再開時の同じ条文を100回シートに追記してから、次の条文に移る・・・という動作を繰り返すことになってしまいます。
60
- これも 「元記事のsheetは、コピー元のシートを意味する」という視点が欠けている故の誤りです。
61
60
 
62
61
  ④ そもそも、どの条文まで読み込んだか?を記録する処理がない。
63
62
  100歩譲って、上記①~③を直したとしても、うまく動きません。
@@ -74,4 +73,7 @@
74
73
  再開時は、法律の第一条から条文を読み込む処理を再度行い、すでに読み込み済みの条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始するようにすればよいでしょう。
75
74
  (質問文記載のコードだと、一番時間のかかる処理は「書き込み」であるため)
76
75
 
76
+ ---
77
77
 
78
+ 現状だと、そこそこ大幅な修正が必要と思います。
79
+ 時間があればコードを載せますが、現状忙しいため、上記ヒントにとどめます。

3

 

2022/11/15 15:07

投稿

退会済みユーザー
test CHANGED
@@ -46,9 +46,9 @@
46
46
  元記事「Google Apps Script で6分以上の処理をする」は実際不親切な記事で質問者さんにはあまり参考にならないと思います。(この記事では「どのような処理について、具体的にどう実装すれば継続できるのか」ということが書かれていません)
47
47
  このため、質問者さんも、よく考えずに適当に追加した挙句「動かない」と困っているのではないでしょうか。
48
48
 
49
- 元記事が元にしているコードは**「あるシート内のデータを1行目から、別のシートに1行ずつコピーする」**という処理を想定したものです。
49
+ 元記事が元にしているコードは **「あるシート内のデータを1行目から、別のシートに1行ずつコピーする」** という処理を想定したものです。
50
- つまり記事のコード中の sheet はコピー元のシートを意味しています。
50
+ つまり記事のコード中の sheet は**コピー元のシート**を意味しています。
51
- 一方質問者さんのコードでは、sheet は抽出した条文の転記先なのですから、全く役割が異なりますよね?
51
+ 一方質問者さんのコードでは、sheet は**抽出した条文の転記先シート**なのですから、全く役割が異なりますよね?
52
52
   
53
53
 
54
54
  ```js

2

 

2022/11/15 15:06

投稿

退会済みユーザー
test CHANGED
@@ -63,14 +63,15 @@
63
63
  100歩譲って、上記①~③を直したとしても、うまく動きません。
64
64
  なぜなら、質問文のコードには、「どこまで書き込んだか」をプロパティに記録することはできても、「どこまで読み込んだか?」を記録し、再開時に読み取り、復元する部分がないため、再開できません。
65
65
 
66
- 元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、わざわざ両者を別々に区別る必要がありません(書き込み済みの行だけプロパティに記録すれば足る、ということです)
66
+ 元記事のコードは、「元シートの内容を別のシートに全く同じ状態で1行ずつコピーする」という至極単純な処理を念頭に置いています。この単純な処理の場合、「書き込み済みの行=読み込み済みの行」といえるので、行数だけ記録ればOKです(書き込み済みの行だけプロパティに記録すれば足る、ということです)
67
67
 
68
- 一方、質問者さんがやろうとしているのは、XMLの複雑な条文を読み込み、形を加工してスプレッドシートに記録する、という処理です。
68
+ 一方、質問者さんがやろうとしているのは、XMLの複雑な条文を読み込み、加工してスプレッドシートに記録する、という処理です。
69
69
 
70
- このような処理の場合、読み込み元には「スプレッドシートの行数」という概念がなく、書き込み行数と1対1対応していないため、書き込み済みデータに対応する「読み込み済み」地点は行数とは別の切り口で記録する必要があります。
70
+ このような処理の場合、読み込み元データには「スプレッドシートの行数」という概念がなく、書き込み行数と1対1対応していないため、書き込み済みデータに対応する「読み込み済み」地点は行数で表現できず、別の切り口で記録する必要があります。
71
+
71
72
  では、どのようなものを使うかですが、ここでは「条文数」が適切でしょう。
72
73
  つまり、中断時に「どの条文まで読み込んだか?」というデータをプロパティに記録しておきます。
73
- 再開時は、法律の第一条から条文を読み込む処理を再度行いが、読み込み済みの条文間は書き込み処理をスキップし、新しく書き込まなければならない条文に至った時点で書き込みを開始するようにすればよいでしょう。
74
+ 再開時は、法律の第一条から条文を読み込む処理を再度行いでに読み込み済みの条文である間は書き込み処理をスキップし、新しく書き込まなければならない条文に到達した時点で書き込みを開始するようにすればよいでしょう。
74
75
  (質問文記載のコードだと、一番時間のかかる処理は「書き込み」であるため)
75
76
 
76
77
 

1

 

2022/11/15 15:03

投稿

退会済みユーザー
test CHANGED
@@ -43,7 +43,7 @@
43
43
  ```
44
44
  としても、 rows.length が 0または1ならば 1>0または1==1ですから、ループは開始しません。
45
45
 
46
- 元記事「Google Apps Script で6分以上の処理をする」は実際不親切な記事で質問者さんにはあまり参考にならないと思います。(この記事では「どのような処理について、具体的にどう実装すれば継続できるのか」ということが書かれていませんおそらくサイト主の方の頭が良すぎて、具体的に説明するまでもないとして説明を飛ばしてしまっているのでしょう
46
+ 元記事「Google Apps Script で6分以上の処理をする」は実際不親切な記事で質問者さんにはあまり参考にならないと思います。(この記事では「どのような処理について、具体的にどう実装すれば継続できるのか」ということが書かれていません)
47
47
  このため、質問者さんも、よく考えずに適当に追加した挙句「動かない」と困っているのではないでしょうか。
48
48
 
49
49
  元記事が元にしているコードは**「あるシート内のデータを1行目から、別のシートに1行ずつコピーする」**という処理を想定したものです。