

タイトルの通りなのですが、あまりデータの範囲が広くないシートの場合は下記コードで正常に動きます。

A1セルにIMPORTRANGEの数式が入っている場合に、そこから全セルの値を取得してそれをsetValuesすることで、A1セルは値になり、他のすべてのセルの値も残ります。

[code]

      const values = sheet.getRange(
        1, 1, sheet.getLastRow(), sheet.getLastColumn()
      ).getValues();
    
      sheet.getRange(
        1, 1, sheet.getLastRow(), sheet.getLastColumn()
      ).setValues(values);
    
[/code]

ですが、より大きなシートになるとsetValuesの途中で6分間の制限にひっかかってしまい、データのすべてがセルに残らなくなってしまうのです。

より高速にとか簡単にGASで、A1セルのIMPORTRANGEの式で取得できた内容をすべて保持しながらA1セルの数式を消すことはできないでしょうか？

単純にA1セルを空白にすると、当然ですがIMPORTRANGEでもってこれていた値はすべて消えてしまいます。

よろしくおねがいします。


CC BY-SA 4.0
2023-01-05T15:18:54.923
93200
2023-01-06T04:28:23.897
2023-01-06T04:28:23.897
3060
21047
question
google-apps-script google-spreadsheet
GASのコードでSpreadSheetのセルの数式IMPORTRANGEで取得されているものを置き換えて値として貼り付けたい


自己解決しました。

setValues は意外と低速で数十列の万単位行だとタイムアウトしますが  
次のようにすると数分で処理が終わりました。

  * シートをすべてコピーしてバックアップシートにする。当然IMPORTRANGE部分もコピーされる。
  * 元シートのIMPORTRANGEの数式を削除する(そのシートのデータは全部消える)
  * バックアップシートから元シートへ、range.copyTo(range) を行う。数値のみのコピーなど指定可能。
  * バックアップシートを削除する

このようにすると、IMPORTRANGEで表示されていたものがIMPORTRANGEをけして値として取得することができます。  
これで2,3,4分くらいかかりますが、動作範囲内で処理が終わりました。

もっとよい方法がありましたら、記載いただけたら助かります。よろしくおねがいします。


CC BY-SA 4.0
2023-01-05T17:55:13.177
93203
2023-01-05T17:55:13.177
21047
93200
answer